【问题标题】:Reassigning Elements of Array: Syntax (Ruby)重新分配数组元素:语法 (Ruby)
【发布时间】:2015-09-29 11:24:16
【问题描述】:

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

【问题讨论】:

标签: arrays ruby syntax assignment-operator parallel-assignment


【解决方案1】:

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 用[1, 0] 替换了array[0,1] 切片,有效地删除了第一个元素并插入了新的[1, 0]。更改为 array[0], array[1] = [1, 0] 也会为您解决这个问题。

【讨论】:

  • 太棒了,感谢您的解释。现在一切都说得通了!
【解决方案2】:

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

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

相比之下,您正在编写array[0, 1],它实际上将数组的“切片”称为一个对象。

【讨论】:

  • 完全误解了 array[0,1] 的含义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
相关资源
最近更新 更多