2012-01-07 54 views
3

可能重複:
Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)爲什麼Ruby數組允許訪問無效的範圍索引?

在Ruby koans之一,有以下問題:

def test_slicing_arrays 
    array = [:peanut, :butter, :and, :jelly] 

    assert_equal _, array[0,1] 
    assert_equal _, array[0,2] 
    assert_equal _, array[2,2] 
    assert_equal _, array[2,20] 
    assert_equal _, array[4,0] 
    assert_equal _, array[4,100] 
    assert_equal _, array[5,0] 
end 

必須在_填入正確的說法。前四個斷言符合我期望他們的工作方式,但我對後三個問題感到困惑。

array[4,0]返回[],與array[4,100]一樣。在這一點上,我認爲數組之外的範圍(在這種情況下大於3)只是返回一個空數組。

但是array[5,0]返回nil現在已經完全困惑了我。

任何人都可以解釋這種行爲嗎?

+1

見http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking- for-explanation-for-illogical-behavior-taken-fr – nimrodm 2012-01-07 19:43:00

+0

希望我在搜索時發現了這個問題 - 謝謝。 – Martin 2012-01-07 19:48:47

+0

這是您在輸入問題時提供的stackoverflow相關問題列表中的第二個問題(請參閱頁面的右側側欄)。無論如何,很高興我可以幫助:) – nimrodm 2012-01-07 21:10:49

回答

2

Ruby不是一種靜態語言,迫使你預先聲明數組的大小。它在您分配給特定元素時擴展數組。

通常我們希望追加到數組的末尾:

array = []  # => [] 
array << 1  # => [1] 
array += [2]  # => [1, 2] 
array.push(3) # => [1, 2, 3] 

或者推到它的前面:

array.unshift(0) # => [0, 1, 2, 3] 

來添加元素,這使陣列累積值,而不差距。

我們可以做到這一點太隨意,這可能是有用的:

array[10] = 10 # => 10 
array   # => [0, 1, 2, 3, nil, nil, nil, nil, nil, nil, 10] 

這就是你遇到了什麼。


您可以預先定義數組的大小,但它仍然是動態的:

ary = Array.new(10, nil) # => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
ary[0] = 0    # => 0 
ary[10] = 10    # => 10 
ary      # => [0, nil, nil, nil, nil, nil, nil, nil, nil, nil, 10] 
ary[12]=12    # => 12 
ary      # => [0, nil, nil, nil, nil, nil, nil, nil, nil, nil, 10, nil, 12] 
+0

除此之外:當需要更嚴格的行爲時,請使用[fetch](http://ruby-doc.org/core-1.9.3/Array.html#method-i-fetch )。如果索引位於數組之外,它可以返回一個錯誤(或者一個默認值,或者一個塊的結果)。 – steenslag 2012-01-07 21:24:58

+0

在所有應有的尊重,這並不能回答這個問題與初學者需要的清晰度。重複問題的[最佳答案](http://stackoverflow.com/a/3568281/26737)更清晰。 – Manur 2014-03-11 14:34:09

+0

它似乎回答了這個問題,令問題的人滿意。這是這裏的度量單位。 – 2014-03-11 16:15:09