2012-01-07 24 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

相关问题