2014-09-26 50 views
0

案例相等運算符Range#===存在並使用Range#include?內部如果我沒有錯。爲什麼Array#===沒有被定義,而Range#===是?

# prints "foo" 
case 2 
when (1..3) 
    puts "foo" 
end 

我想知道爲什麼這不是Array類的情況......它打破了我認爲最不驚奇的原則。我希望這能夠奏效,但事實並非如此。

# does not print "foo" 
case 2 
when [1, 2, 3] 
    puts "foo" 
end 

它是出於性能原因嗎?

+0

''[2,3,2] === [3,2,2]'因爲它們有相同的元素,只是不同的順序? – lcguida 2014-09-26 12:46:29

回答

1

你說錯了。 Array#===定義(更確切地說,Array#===本身沒有定義,但它繼承)。如果沒有定義,那麼你的代碼會產生一個錯誤。

aArraya === obj定義爲truea == obj,並且您的代碼不打印"foo"因爲[1, 2, 3]2

+0

我想OP想知道*爲什麼沒有'Array#==='的行爲就像'Range#===',即當參數是數組的成員時重新調用'true'。 – Stefan 2014-09-26 14:01:19

+0

@sawa:你說得對,[1,2,3] === 2不會引發,因爲Array實例使用的「===」方法是繼承的(從Object類中的Kernel#===),我原來的帖子在這一點上可能不夠清楚。 Stefan也是對的,但我真正想知道的是爲什麼沒有Array#===覆蓋繼承的內核#===。 [1,2,3] === 2返回true對我來說就像(1..3)=== 2返回true一樣有意義。 – 2014-09-26 20:35:31

1

就是這樣,因爲===由case語句在內部使用。

case (4..10)匹配時給出5是有道理的; case [4, 5, 6, 7, 8, 9, 10]更不用說了。 (如果你需要在case語句中匹配任何一個數組的元素,你可以畫出它:case *[4, 5, 6, 7, 8, 9, 10]

0

我完全同意數組有點打破字符,通過不提供「如果一個集合,然後a = == b是否b是其他核心類提供的語義的一部分,也就是說,在Ruby中===的主要目的是允許類支持case ... when語句

我猜這種差異來自於如何...當涉及數組的語句被處理時:

case [1, 2] 
when [1, 2] 
when [1, 2, 3] 
when [1, 2, [1, 2]] 
end 

你可以看到,所有情況都會匹配,每個情況都有不同的原因。

我覺得到底是太模棱兩可了。如前所述,splat操作符可以用於覆蓋離散集合用例。

由於範圍不是嵌套結構,因此這些類型的問題根本不適用。

相關問題