我刚刚注意到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"
答案 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"