2016-06-28 19 views
1

功能或bug:所有空Immutable.Lists測試爲相同。所有空Immutable.Lists是相同的

例如:

var xxx = new Immutable.List(); 
var yyy = new Immutable.List(); 
xxx === yyy; // true 

var zzz = yyy.push(1).pop(); 
zzz === yyy; // true 

zzz = Immutable.fromJS([]); 
xxx === zzz; // true 

我能看到爲什麼你可能要考慮所有的空列表作爲相同的,但我也有在那裏,只是因爲2名列表是空的使用情況並不意味着他們是相同。作爲一個反例,如果我創建兩個具有相同內容的Immutable.Lists,它們不會測試爲相同的。

有沒有辦法告訴2空列表分開?

您認爲這是一個錯誤嗎?

回答

0

我不是Immutable.js的專家,也不是貢獻者,但我會嘗試在不可變的數據結構中寫下一些想法。

Immutable.js針對性能進行了優化。尤其對於執行平等檢查。不變的背後的想法是,如果我們有不可變的數據結構,我們可以通過比較引用來確定結構是否發生了變化。

export function is(valueA, valueB) { 
    if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { 
    return true; 
    } 
    // ... 
} 

如果他們是一樣的,我們總是可以假設結構仍然是相同的,因爲它是不可變的:第一件事情,如果引用是相等的Immutable.is的FPGA實現並正在檢查。使所有空列表相等可以提高性能。

我們還需要了解的是,不可變數據結構廣泛用於函數式編程語言(Immutable.js is actually inspired by Scala and Closure)。函數式編程語言比其他語言更接近數學。數學是基於價值的,這意味着在數學中沒有實例。我們假設包含元素1,2和3的集合等於一組1,2和3.空集合總是等於空集合。空列表等於空列表。

從斯卡拉REPL一些有趣的結果:

scala> List(1, 2, 3) == List(1, 2, 3) 
res0: Boolean = true 

scala> Nil == Nil 
res1: Boolean = true 

scala> 1 :: 2 :: 3 :: Nil == List(1, 2, 3) 
res2: Boolean = true 
+0

這就是爲什麼我傾向於認爲這是不是一個錯誤。但是, 'new Immutable.List([1,2,3])=== new Immutable.List([1,2,3])' 不會評估爲真,因此這裏存在一些不一致。雖然評估空的結構是相當便宜的,但我認爲我們會不惜一切代價避免深入比較。我一直在假設不同的實例實際上是不同的,不管它們的內容如何。因此我的問題。 –

相關問題