为什么在 ruby 1.9 中可以使用 === 来调用 procs?
-
12-12-2019 - |
题
本文 提到了 Ruby 1.9 中调用 procs 的 4 种方法, === 就是其中之一。我根本不明白为什么要这样做。它和 === 的正常含义(询问两个对象是否是同一个对象)有什么关系吗?
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, #]
解决方案
它允许 proc 对象成为
when
案例语句中的条款。
这是一个可能是人为的例子:
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
子句,选择第一个返回真值的子句。
尽管它与相等运算符相似(==
)它不是它的更强或更弱的形式。我试着想 ===
运算符作为“属于”运算符。 Class
定义它以便你可以检查一个对象是否 属于 班级(即是该类的实例或该类的子类), Range
将其定义为检查参数是否 属于 范围(即包含在范围内),等等。这并不能真正使 Proc
case 更有意义,但请将其视为制作自己的工具 属于 运算符,就像我上面的例子;我定义了一个可以确定是否有东西的对象 属于 偶数的集合。
其他提示
请注意,与JavaScript不同,Ruby中的生成阴极缩放代码不是相等的。它专门使用 for case表达式:
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
. 此功能在建筑物时很有用,当您需要在比较时计算某些东西。
is_odd =-> n { n%2 != 0 }
is_even =-> n { n%2 == 0 }
case 5
when is_even
puts "the number is even"
when is_odd
puts "the number is odd"
end
=> the number is odd
. 它和 === 的正常含义(询问两个对象是否是同一个对象)有什么关系吗?
事实上,这是一个常见的误解 ===
在红宝石中。其实严格来说并不是为了 Object#object_id
比较(尽管这是它在许多常见调用中的行为)。在红宝石中, ===
是这样的 包容.
这是描述 ===
从 Object
:“案例平等 - 对于班级对象,有效地与调用#==相同,但通常被后代覆盖以提供有意义的语义。”
遗憾的是,尽管它由三部分组成 =
, ,它与平等没有任何关系:-D