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案例更有意义,而是将其视为使自己属于运算符的工具,就像我上面的例子;我定义了一个对象,可以确定某些东西是否属于偶数组.