为什么我不能改变自我的价值?

时间:2014-09-14 14:42:16

标签: ruby self

为什么我被允许以这种方式改变“自我”:

self.map! {|x| x*2}

或者这样:

self.replace(self.map {|x| x*2})

但不是这样:

self = self.map {|x| x*2}

为什么Ruby不允许我更改“self”变量指向的对象,但允许我更改对象的属性?

2 个答案:

答案 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将不再指向调用该方法的对象,这是一个基本假设。