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

前端之家收集整理的这篇文章主要介绍了为什么在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案例更有意义,而是将其视为使自己属于运算符的工具,就像我上面的例子;我定义了一个对象,可以确定某些东西是否属于偶数组.

猜你在找的Ruby相关文章