以下b
所做的修改也是为了a
:
a = 'taco'
b = a
b << 's'
a #=> tacos
当我通过将变量指向另一个变量y
来分配x
变量时,x
仍然是y
的快捷方式; x
和y
将是相同的。这似乎被dup
方法所证实;通过说b = a.dup
,b
得到a
在赋值的那一刻的价值,而不是捷径。
但这不会发生在整数上。当我分配b
时,它似乎得到了a
的值:
a = 4815
b = a
b /= 2
a #=> 4815
似乎字符串变量通过引用传递,而整数变量通过值传递。这似乎不对;我知道我的理解有些不对劲,但我不确定是什么。
您需要了解变量和值之间的区别。变量指向一个值。多个变量可以指向相同的值。
在 Ruby 中,修改变量的唯一方法是通过赋值,或者简单
foo = :something
或复合分配
foo ω= :something # for some operator ω
# e.g.
foo += :something
foo <<= :something
foo ||= :something
如果修改某个值,则无论使用什么变量访问该值,该修改都将可见。
可以这样想:我妈妈叫我"儿子",我的朋友叫我"Jörg",我的好朋友叫我"jwm",我的乐队同事叫我">Jörgislaw",我女朋友叫我"宝贝",但不管他们怎么称呼我,如果我剪头发,我的头发就会消失,不管他们用什么名字来称呼我。但是,如果我的女朋友为"baby"标签分配了一个新的值,那么这不会影响我。(嗯...请耐心等待,这是一个类比:-D
在 Ruby 中,<<
通常会修改接收器,而/
不会。
但是,Ruby 始终是按值传递的。但是传递的值是指向值的指针,因此多个变量可以包含指向同一值的同一指针的多个副本。
你在争论什么,b /= 2
是b = b / 2
的语法糖。因此,新的b
是b / 2
(或a / 2
(,这与a
无关。
错,见Fixnum
:
Fixnum
对象具有即时价值。这意味着当它们作为参数赋值或传递时,将传递实际对象,而不是对该对象的引用。赋值不会为对象
Fixnum
别名。对于任何给定的整数值,实际上只有一个Fixnum
对象实例,因此,例如,不能将单一实例方法添加到Fixnum
。任何向Fixnum
对象添加单一实例方法的尝试都会引发TypeError
。