我记得一些关于case
Ruby 2.0 中的语句中允许使用 procs 的内容,但我无法用谷歌搜索它。
我尝试检查Ruby 2.0.0 NEWS和How to write a switch statement in Ruby。我还访问了http://ruby-doc.org,但它的关键字链接是针对 Ruby 1.9 的,而不是针对 Ruby 2.0 的。
是否允许在案例陈述中使用 procs?
我记得一些关于case
Ruby 2.0 中的语句中允许使用 procs 的内容,但我无法用谷歌搜索它。
我尝试检查Ruby 2.0.0 NEWS和How to write a switch statement in Ruby。我还访问了http://ruby-doc.org,但它的关键字链接是针对 Ruby 1.9 的,而不是针对 Ruby 2.0 的。
是否允许在案例陈述中使用 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
:
使用 proc 的参数调用块,
obj
例如#call
. 它是允许proc对象成为语句中when
子句的目标case
。
对于 Ruby 初学者,when
Ruby 语句中的 then 子句case
获取子句中的值并调用其===
上的方法,将参数传递给 case 语句。所以,例如,这段代码……</p>
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!