为什么我被允许以这种方式改变“自我”:
self.map! {|x| x*2}
或者这样:
self.replace(self.map {|x| x*2})
但不是这样:
self = self.map {|x| x*2}
为什么Ruby不允许我更改“self”变量指向的对象,但允许我更改对象的属性?
答案 0 :(得分:4)
不是答案,只是一个线索。
a=[1,2]
=>[1,2]
a.object_id
=>2938
a.map!{|x| x*2}
=>[2,4]
a.object_id # different data but still the same object
=>2938
a.replace(a.map {|x| x*2})
=>[4,8]
a.object_id # different data but still the same object
=>2938
a = a.map{|x| x*2} # .map will create a new object assign to a
=>[8,16]
a.object_id #different object
=>2940
你不能把自己变成另一个人。
答案 1 :(得分:2)
在Ruby中,值和变量是引用(指向对象的指针)。分配给变量只会使其指向不同的对象;它对变量用来指向的对象没有影响。要更改对象,必须在其上调用方法(包括属性getter / setter)。
您可以将self
视为指向调用该方法的对象的变量。如果你可以分配它,你可以让它指向另一个对象。如果你能做到这一点,它就不会改变调用该方法的对象;相反,你应该这样做,以便该方法中使用self
的任何后续代码都将使用该对象,而不是调用该方法的对象。这将是非常混乱,因为self
将不再指向调用该方法的对象,这是一个基本假设。