整数变量按值传递,字符串变量按引用传递?

时间:2015-03-06 13:37:02

标签: ruby immutability

以下对b所做的修改也适用于a

a = 'taco'
b = a
b << 's'
a #=> tacos

当我通过将变量指向另一个变量x来指定变量y时,x仍然是y的快捷方式; xy将完全相同。 dup方法似乎证实了这一点;通过说b = a.dupb在分配时获取a的值,而不是快捷方式。

但是整数不会发生这种情况。当我分配b时,似乎获得了a

的值
a = 4815
b = a
b /= 2
a #=> 4815

似乎字符串变量通过引用传递,而整数变量通过值传递。这看起来并不正确;我知道我的理解有些不对劲,但我不确定是什么。

3 个答案:

答案 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的语法糖。因此,新bb / 2(或a / 2),与a无关。

答案 2 :(得分:2)

这是正确的,请参阅Fixnum

  

Fixnum个对象具有直接价值。这意味着当它们作为参数分配或传递时,将传递实际对象,而不是对该对象的引用。

     

分配不会对Fixnum个对象进行别名。对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单例方法添加到Fixnum。任何向单个Fixnum对象添加单例方法的尝试都会引发TypeError

相关问题