我对在 Ruby 中对整数、字符串和数组执行简单的加法/连接时得到的不同结果感到困惑。我的印象是,将变量 b 分配给 a(见下文),然后更改 a 的值时,b 将保持不变。在前两个示例中也是如此。但是当我在第三个示例中修改 Array a 时,a 和 b 都被修改了。
a = 100
b = a
a+= 5
puts a
puts b
a = 'abcd'
b = a
a += 'e'
puts a
puts b
a = [1,2,3,4]
b = a
a << 5
puts a.inspect
puts b.inspect
以下是上述代码在终端中返回的内容:
Ricks-MacBook-Pro:programs rickthomas$ ruby variablework.rb
105
100
abcde
abcd
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Ricks-MacBook-Pro:programs rickthomas$
我的编程教练给了我以下解释:
将某些内容分配给新变量只是给它一个额外的标签,它不会复制。
看起来 += 是一种方法,就像 << 一样,因此您希望它的行为相似。但实际上,它是“语法糖”,添加到语言中以使开发人员更轻松。
当您运行 a += 1 时,Ruby 会将其转换为 a = a + 1。
在这种情况下,我们不会修改 a.Fixnum 中的 Fixnum。相反,我们实际上是在它之上重新分配,有效地消除了 a 的先前值。
另一方面,当您运行 b << "c" 时,您正在通过将字符串 "c" 附加到它来修改底层数组。
我的问题是:
1)他提到了语法糖,但这不也是 << 是什么,即 .push 方法的语法糖吗?
2)如果 += 是语法糖或更正式的方法,为什么这很重要?如果两者之间存在一些差异,那么这是否意味着我之前对语法糖的理解(“编程语言中旨在使事情更容易阅读或表达的语法”)是不完整的,因为这不是它的唯一目的是什么?
3)如果将b分配给a不会复制a,那么为什么不擦除a的旧值意味着对于所有3种情况(整数,字符串和数组)也擦除b的旧值?
正如你所看到的,我对一些我认为我直到现在都理解的事情很感兴趣。任何帮助深表感谢!