可能重复:
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
,现在我已经完全迷惑了我。
任何人都可以解释这种行为吗?
答案 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]