本文 提到了 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 更有意义,但请将其视为制作自己的工具 属于 运算符,就像我上面的例子;我定义了一个可以确定是否有东西的对象 属于 偶数的集合。

其他提示

此功能在建筑物时很有用,当您需要在比较时计算某些东西。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top