【问题标题】:Why does a Ruby array allow access to invalid range index? [duplicate]为什么 Ruby 数组允许访问无效的范围索引? [复制]
【发布时间】:2012-01-07 19:26:12
【问题描述】:

可能重复:
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,这让我完全糊涂了。

谁能解释这种行为?

【问题讨论】:

  • 希望我在搜索时发现了这个问题 - 谢谢。
  • 这是您输入问题时stackoverflow提供的相关问题列表中的第二个(参见页面右侧边栏)。无论如何,很高兴我能帮忙:)

标签: ruby arrays


【解决方案1】:

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]

【讨论】:

  • 除此之外:当需要更严格的行为时,使用fetch。如果索引位于数组之外,它可能会返回错误(或默认值,或块的结果)。
  • 恕我直言,这并不能清楚地回答红宝石初学者需要的问题。重复问题的top answer 更清晰。
  • 它的回答似乎让提出问题的人满意。这是这里的计量单位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2022-12-23
  • 2019-11-25
相关资源
最近更新 更多