【发布时间】:2013-03-27 20:37:40
【问题描述】:
我对在 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。相反,我们实际上是在它之上重新赋值,有效地消除了 a 的先前值。
另一方面,当您运行 b
我的问题是:
1) 他提到了语法糖,但这不也是
2) 为什么 += 是语法糖或更正式的方法会很重要?如果两者之间存在一些差异,那么这是否意味着我之前对句法糖的理解(“编程语言中旨在使事情更易于阅读或表达的句法”)是不完整的,因为这不是它的唯一目的是什么?
3) 如果将 b 分配给 a 不会复制 a,那么为什么不擦除 a 的旧值意味着在所有 3 种情况下(整数、字符串和数组)也擦除 b 的旧值?
如您所见,我对一些我认为我直到现在都理解的事情非常感兴趣。非常感谢任何帮助!
【问题讨论】:
-
你想让我们解释一下为什么会有两个不同的结果吗?
-
@iAmRubuuu- 是的,我看到你已经在下面这样做了。 object_id 的解释很有帮助,谢谢。
标签: ruby syntactic-sugar