proc可以与Ruby 2.0中的case语句一起使用吗?

我记得 Ruby 2.0中的case语句允许使用procs,但我不能谷歌.

我试过检查Ruby 2.0.0 NEWSHow to write a switch statement in Ruby.我也访问了http://ruby-doc.org,但是关键字的链接是Ruby 1.9,而不是Ruby 2.0.

案件陈述中是否允许触发?

解决方法

是.
2.0.0p0 :001> lamb = ->(x){ x%2==1 }
#=> #<Proc:0x007fdd6a97dd90@(irb):1 (lambda)> 

2.0.0p0 :002> case 3; when lamb then p(:yay); end
:yay
#=> :yay 

2.0.0p0 :003> lamb === 3
#=> true 

2.0.0p0 :007> lamb === 2
#=> false

然而,这与1.9.1没有什么不同,因为当时定义了Proc#===.由于ruby-docs似乎在显示方法时遇到问题,要清楚文档说proc === obj:

Invokes the block with obj as the proc’s parameter like #call. It is to allow a proc object to be a target of when clause in a case statement.

对于Ruby初学者,那么Ruby的case语句中的when子句获取子句中的值并在其上调用===方法,将参数传递给case语句.所以,例如,这段代码……

case "cats"
  when /^cat/ then puts("line starts with cat!")
  when /^dog/ then puts("line starts with dog!")
end

…运行/ ^ cat / ===“cats”来判断它是否匹配; RegExp类定义了===方法来执行正则表达式匹配.因此,只要为它定义===,就可以在when子句中使用自己的对象.

Moddable = Struct.new(:n) do
  def ===(numeric)
    numeric % n == 0
  end
end

mod4 = Moddable.new(4)
mod3 = Moddable.new(3)

12.times do |i|
  case i
    when mod4
      puts "#{i} is a multiple of 4!"
    when mod3
      puts "#{i} is a multiple of 3!"
  end
end

#=> 0 is a multiple of 4!
#=> 3 is a multiple of 3!
#=> 4 is a multiple of 4!
#=> 6 is a multiple of 3!
#=> 8 is a multiple of 4!
#=> 9 is a multiple of 3!

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...