ruby - 负索引如何与 `Array#[]=` 一起使用?

标签 ruby arrays

我试着看看 Array#[]= 是如何工作的,并尝试了一下:

enum[int] = obj → obj
enum[start, length] = obj → obj
enum[range] = obj → obj

问题一

我有一个数组 b 在其 0 索引处包含 nil

b = []
b[0]   # => nil

我试图在下面的代码中用整数 10 替换 nil

b[-1] = 10 # => IndexError: index -1 too small for array; minimum: 0

为什么上面的代码不起作用,而下面的代码却起作用了?对于大小为 1 的数组,为什么索引 0-1 的处理方式不同?

b[0] = 5   # => 5
b[-1] = 10 # => 10

问题二

我创建了一个大小为 2 的数组,并执行了以下操作:

a = [1,2]

a[-3] = 3       # => IndexError: index -3 too small for array; minimum: -2
a[-3] = [3]     # => IndexError: index -3 too small for array; minimum: -2
a[-3..-4] = [3] # => RangeError: -3..-4 out of range

我相信负索引永远不会增加数组的大小,但我不知道为什么。为什么下面的代码成功了?

a[-2..-3] = [3,4] #=> [3, 4]

最佳答案

我建议您看一下 Array documentation 中的第一段.令人惊讶的是:“假定负索引是相对于数组末尾的——也就是说,索引 -1 表示数组的最后一个元素,-2 是数组中倒数第二个元素,等等上。”

这意味着,您可以设置 a[-N]第一个元素当且仅当 |N| <= a.size .这就是为什么 a = [1,2] ; a[-3] = 3失败 (3 > 2)。

另一方面,ruby 数组有[可能] 未记录的功能:a[INBOUNDS_IDX..NONSENSE_IDX]=SMTH插入 SMTH 之前 INBOUNDS_IDX索引:

a=[1,2]
a[2..0]='a'
a[2..1]='b'
a[2..-100]='c'
# ⇒ [1, 2, "c", "b", "a"]
a[2..-1]='q'
# ⇒ [1, 2, "q"]

这里废话的意思是“小于 INBOUNDS_IDX,and 不能被视为负数中的索引”(这就是为什么上例中的 a[2..-1] 被视为 a[2..(a.size - 1)] 的原因。)

关于ruby - 负索引如何与 `Array#[]=` 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049744/

相关文章:

ruby-on-rails - 将 Rails 中的主键更改为字符串

ruby-on-rails - 项目 :Class 的未定义方法 `model_name'

ruby - 如何从 shapefile .prj 中读取 WKT?

ruby - 如何使用第二个数组中的值对对象数组进行排序

调用 exec 的 Python 内存错误

c - 在动态数组中存储值

c++ - 使用 boost::bind 输出作为数组下标

ruby-on-rails - 如何覆盖 Rails 中的 View

ruby-on-rails - WickedPDF 本地渲染与生产渲染不同

c - 将文件的每一行读入数组