以下对b
所做的修改也适用于a
:
a = 'taco'
b = a
b << 's'
a #=> tacos
当我通过将变量指向另一个变量x
来指定变量y
时,x
仍然是y
的快捷方式; x
和y
将完全相同。 dup
方法似乎证实了这一点;通过说b = a.dup
,b
在分配时获取a
的值,而不是快捷方式。
但是整数不会发生这种情况。当我分配b
时,似乎获得了a
:
a = 4815
b = a
b /= 2
a #=> 4815
似乎字符串变量通过引用传递,而整数变量通过值传递。这看起来并不正确;我知道我的理解有些不对劲,但我不确定是什么。
答案 0 :(得分:3)
您需要了解变量和值之间的区别。 变量指向值。多个变量可以指向相同的值。
在Ruby中,唯一修改变量的方法是通过赋值,简单
foo = :something
或复合作业
foo ω= :something # for some operator ω
# e.g.
foo += :something
foo <<= :something
foo ||= :something
如果您修改值,无论您使用哪个变量来访问该值,该修改都将可见。
以这种方式思考:我的妈妈称我为“儿子”,我的朋友称我为“Jörg”,我的亲密朋友称我为“jwm”,我的乐队同事称我为“Jörgislaw”,我的女朋友叫我“宝贝” ,但无论他们怎么称呼我,如果我剪了头发,我的头发就会消失,不管他们用什么名字来指我。但是,如果我的女朋友给“宝贝”这个标签赋予了新的价值,那么这对我没有影响。 (好吧......忍受我,这是一个类比:-D)在Ruby中,<<
通常会修改接收器,而/
则不会。
但是,Ruby 总是按值传递。但传递的值是指向值的指针,因此多个变量可以包含指向同一值的同一指针的多个副本。
答案 1 :(得分:2)
无论你在争论什么,b /= 2
都是b = b / 2
的语法糖。因此,新b
为b / 2
(或a / 2
),与a
无关。
答案 2 :(得分:2)
这是正确的,请参阅Fixnum
:
Fixnum
个对象具有直接价值。这意味着当它们作为参数分配或传递时,将传递实际对象,而不是对该对象的引用。分配不会对
Fixnum
个对象进行别名。对于任何给定的整数值,实际上只有一个Fixnum
对象实例,因此,例如,您不能将单例方法添加到Fixnum
。任何向单个Fixnum
对象添加单例方法的尝试都会引发TypeError
。