2012-05-07 54 views
1

只是想知道數組和範圍之間的細微差別是什麼。我碰到一個例子,我有x = *(1..10)作爲一個數組輸出x和*(1..10) == (1..10).to_a引發錯誤。這對我來說意味着兩者之間存在細微的差異,我只是好奇它是什麼。ruby​​中的數組和範圍有什麼區別?

回答

6

首先,當您不處於任務或參數傳遞的中間時,*(1..10)是語法錯誤,因爲splat操作符不會以這種方式解析。這本質上並不涉及數組或範圍,但我想我會清楚爲什麼這是一個錯誤。

其次,陣列和範圍真的是蘋果和橘子。數組是一個對象,它是任意元素的集合。範圍是具有「開始」和「結束」的對象,並且知道如何從開始移動到結束而不必枚舉其間的所有元素。

最後,當你將一個範圍轉換爲一個帶有to_a的數組時,你並不是真的「轉換」它,就像你說的那樣,「從這個範圍的開始開始,並且繼續給出元素直到你到達結束」。在「(1..10)」的情況下,範圍是給你1,然後2,然後3,依此類推,直到你達到10爲止。

+0

擊敗我吧。 +1指出該錯誤與Range無關。 –

+0

「從開始移動到結束」部分是可選的,只有當範圍的起始位置響應'succ'時才適用(http://ruby-doc.org/core-1.9.3/Range.html#method- I-每個)。 –

1

一個區別是,範圍不單獨存儲每個元素本身,不像數組。

r = (1..1000000) # very fast 
r.to_a # sloooooow 

但是,您失去了索引到任意點的能力。

相關問題