为什么Ruby数组允许访问无效范围索引?

时间:2012-01-07 19:26:13

标签: ruby arrays

  

可能重复:
  Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

在其中一个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 个答案:

答案 0 :(得分: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]