为什么在ruby 1.9中可以使用===调用proc?

This article提到了4种在ruby 1.9中调用proc的方法,而===就是其中之一.我不明白为什么会这样做.它是否与===的正常含义有任何关系(询问这两个对象是否是同一个对象)?
irb(main):010:0> f =-> n {[:hello,n]}
=> #
irb(main):011:0> f.call(:hello)
=> [:hello,:hello]
irb(main):012:0> f === :hello
=> [:hello,:hello]
irb(main):013:0> Object.new === Object.new
=> false
irb(main):014:0> f === f
=> [:hello,#]

解决方法

This is what the docs have to say

It is to allow a proc object to be a target of when clause in the
case statement.

这是一个可能是人为的例子:

even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
  puts "even!"
else
  puts "odd!"
end

它的工作原理是因为case / when基本上是这样执行的:

if even === n
  puts "even!"
else
  puts "odd!"
end

case / when通过在when子句的参数上调用===来检查哪些分支执行,选择返回truthy值的第一个.

尽管它与等式运算符(==)相似,但它并不是更强或更弱的形式.我试着将===运算符视为“属于”运算符.类定义它以便您可以检查对象是否属于该类(即,是类的实例还是类的子类),Range将其定义为检查参数是否属于该范围(即包含在范围),等等.这并没有真正使Proc案例更有意义,而是将其视为使自己属于运算符的工具,就像我上面的例子;我定义了一个对象,可以确定某些东西是否属于偶数组.

相关文章

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