为什么Array不覆盖Ruby中的三重等号方法?

时间:2011-10-12 01:10:30

标签: ruby language-design switch-statement equality

我刚刚注意到Array不会覆盖三重等号方法===,有时称为大小写等式方法。

x = 2

case x
  when [1, 2, 3] then "match"
  else "no match"
end # => "no match"

而范围运算符确实:

x = 2

case x
  when 1..3 then "match"
  else "no match"
end # => "match"

您可以为数组执行一种解决方法:

x = 2

case x
  when *[1, 2, 3] then "match"
  else "no match"
end # => "match"

知道为什么会这样吗?

是因为x更有可能是一个实际的数组而不是一个范围,而重写===的数组会意味着普通的相等不匹配吗?

# This is ok, because x being 1..3 is a very unlikely event
# But if this behavior occurred with arrays, chaos would ensue?
x = 1..3

case x
  when 1..3 then "match"
  else "no match"
end # => "no match"

1 个答案:

答案 0 :(得分:2)

因为它是in the specification

it "treats a literal array as its own when argument, rather than a list of arguments"

规范was added 2009年2月3日Charles Nutter@headius)。由于这个答案可能不是你想要的,你为什么不问他?

在黑暗中采取疯狂且完全不知情的刺伤,在我看来,你可能在问题中使用a splat来找到答案。由于功能是可以设计的,为什么重复这样做会删除测试Array相等的能力?正如Jordan指出的那样,存在有用的情况。


未来的读者应该注意,除非已经实例化了相关数组,否则根本不需要使用数组来匹配多个表达式:

x = 2

case x
  when 1, 2, 3 then "match"
  else "no match"
end # => "match"