【问题标题】:Why does this array slice return an empty array instead of nil? [duplicate]为什么这个数组切片返回一个空数组而不是 nil? [复制]
【发布时间】:2011-04-07 16:25:13
【问题描述】:

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

我一直在玩 ruby​​ 中的数组切片,但我不明白下面的最后 2 个结果:

a = [1,2,3]
a[2,1]      # output is [3]
a[3,1]      # output is []    ...why??
a[4,1]      # output is nil   ...according to the docs this makes sense

为什么a[3,1] 是一个空数组,而a[4,1] 是零?

如果有的话,我希望a[3,1] 也会返回 nil。根据ruby docs,如果起始索引超出范围,则数组拆分应返回 nil。那么为什么a[3,1] 没有返回零呢?

注意:这是在 ruby​​ 1.9.2 上

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您要求数组的结尾,即[]。这样看:数组[1,2,3] 可以被认为是由cons 单元构造而成的:(1, (2, (3, ()))1:2:3:[]。第三个索引(第 4 项)显然是 []

    【讨论】:

      【解决方案2】:

      " 如果索引(或起始索引)超出范围,则返回 nil。"

      a[3,1] 是根据同一链接中的示例的特殊情况。

      更多信息可以顺便看这里:Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

      【讨论】:

      • 哦,等等,嗯,是的,这很奇怪,哈哈
      • 呵呵是的。执行 a[3] 返回 nil,所以我知道它超出了范围。
      • 确实有和你一样的例子,看看a[5,1],也返回空数组
      • 我使用的是 1.9.2,对于 a[5,1] 我得到了 nil。
      • 它显然是一个特例。使用 a[a.size,1] 将返回一个空数组
      【解决方案3】:

      如果您将切片想象为作业的左侧,则更容易理解为什么。

      >> (b = a.clone)[2,1] = :a; p b
      [1, 2, :a]
      >> (b = a.clone)[2,0] = :b; p b
      [1, 2, :b, 3]
      >> (b = a.clone)[3,1] = :c; p b
      [1, 2, 3, :c]
      >> (b = a.clone)[3,0] = :d; p b
      [1, 2, 3, :d]
      

      【讨论】:

      • 这只是推送到数组的另一种方式吗?
      • 你知道这样的事情会有用吗?现在我对 WHY 比 HOW 更好奇。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      相关资源
      最近更新 更多