重新分配数组元素:语法 (Ruby)

Reassigning Elements of Array: Syntax (Ruby)

我正在 Ruby 中学习并行赋值运算符。当我尝试使用它来交换数组中的值时,我得到了意想不到的结果。无法在线找到此问题的答案,希望有人能阐明这里发生的事情。

第一个例子:

array = [1,2,3]
=> [1, 2, 3]
array[0,1] = array[1,0] 
=> []
array
=> [2, 3] #thought this would be = [2,1,3]

array[0] 去了哪里,为什么 Ruby 不交换值?

第二个例子:

array = [1,2,3]
=> [1, 2, 3]
array[0,1] = [1,0]
=> [1, 0]
array
=> [1, 0, 2, 3] #was expecting [1,0,3]

为什么 Ruby 将右侧插入数组而不替换值?

array[0,1] 语法正在选取数组的一部分,从 0 开始,长度为 1。更长的切片使它更明显。

> a = [1,2,3]
 => [1,2,3]
> a[0,2]
 => [1, 2]

要在第一个示例中以您想要的方式交换,您需要单独指定两个索引。

> a[0], a[1] = a[1], a[0]
 => [2, 1]
> a
 => [2, 1, 3]

在您的第二个示例中,Ruby 将 array[0,1] 切片替换为 [1, 0],有效地删除了第一个元素并插入了新的 [1, 0]。更改为 array[0], array[1] = [1, 0] 也会为您解决这个问题。

并行赋值涉及在运算符的左侧指定多个变量 - 您的第一次尝试很接近,但不是我认为您打算做的。为了获得您期望的行为,您需要编写:

array[0], array[1] = array[1], array[0]

相反,您写的是 array[0, 1],它有效地将数组的 "slice" 作为一个对象引用。