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

Joh*_*hir 6 ruby ruby-1.9 proc-object

本文提到了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, #]

Phr*_*ogz 5

请注意===,与JavaScript不同,Ruby不是关于相等性的.它专门用于案例表达式:

case cats.length
  when 42                         # Uses 42      === cats.length
    puts :uh
  when /cool/i                    # Uses /cool/i === cats.length
    puts :oh
  when ->(n){ n.odd? || n/3==6 }  # Passes cats.length to the proc
    puts :my
end
Run Code Online (Sandbox Code Playgroud)


The*_*heo 4

这是文档必须说的

它允许 proc 对象成为whencase 语句中子句的目标。

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

even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
  puts "even!"
else
  puts "odd!"
end
Run Code Online (Sandbox Code Playgroud)

它之所以有效,是因为它case/when基本上是这样执行的:

if even === n
  puts "even!"
else
  puts "odd!"
end
Run Code Online (Sandbox Code Playgroud)

通过调用子句的参数来检查case/when要执行哪个分支,选择第一个返回真值的分支。===when

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