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

Posted

技术标签:

【中文标题】procs 可以与 Ruby 2.0 中的 case 语句一起使用吗?【英文标题】:Can procs be used with case statements in Ruby 2.0? 【发布时间】:2013-05-15 18:21:52 【问题描述】:

我记得在 Ruby 2.0 中的 case 语句中允许使用 procs,但我无法通过 google 搜索。

我尝试检查Ruby 2.0.0 NEWS 和How to write a switch statement in Ruby。我还访问了 http://ruby-doc.org ,但它的关键字链接是 Ruby 1.9,而不是 Ruby 2.0。

是否允许在 case 语句中使用 proc?

【问题讨论】:

我还以为是以前的。 【参考方案1】:

是的。

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 初学者,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!

【讨论】:

l 看起来与 Stack Overflow 上的 1 非常相似。我想知道乔治奥威尔是否已经被任命为数学系的负责人! (PS:有没有关于在案例语句中使用 procs 的文档?) 我链接到 1.9.1 文档,但似乎所有现代版本的文档都未能为该方法提供适当的标题,这使得它非常混乱。我将使用Proc#=== 上的文档编辑问题。 感谢 phroggie,为我刷新了 Proc#===

以上是关于procs 可以与 Ruby 2.0 中的 case 语句一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - lambda 与 Proc.new [重复]

Ruby 中的 proc 和 lambda 有啥区别?

Ruby 2.1 与 Ruby 2.0 或 1.9 相比,内存使用量增加

是否可以在 proc 中看到 ruby​​ 代码?

Ruby:将proc转换为lambda?

ruby中proc和lambda的return区别