1

我现在正在学习 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 将右侧插入数组而不替换值?

4

2 回答 2

5

array[0,1]语法是选择从 和 开始的数组切片0length 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]也会为您解决这个问题。

于 2015-07-10T16:10:38.650 回答
2

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

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

相反,您正在编写array[0, 1],它有效地将数组的“切片”称为一个对象。

于 2015-07-10T16:11:34.453 回答