在Ruby 2.0中可以使用case语句吗?

我记得在Ruby 2.0的case语句中允许使用procs,但我无法谷歌它。

我试着检查Ruby 2.0.0 NEWS和如何在Ruby中编写switch语句。 我还访问了http://ruby-doc.org,但是它的关键字链接是用于Ruby 1.9,而不是Ruby 2.0。

case语句中允许使用procs吗?


是。

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

obj作为proc的参数调用块,如#call 。 它允许proc对象成为case语句中when子句的目标。


对于Ruby初学者,那么when 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!
链接地址: http://www.djcxy.com/p/4355.html

上一篇: Can procs be used with case statements in Ruby 2.0?

下一篇: e mean in a bash script?