2010-12-08 51 views
1

基于this blog水龙头的作品是这样的,我同意。为什么我没有得到错误当自己被分配的东西

class Object 
    def tap 
    yield self 
    self 
    end 
end 

这里是我的实验

class Lab 
end 

puts Lab.new.tap {|e| e = 'Boom' } 

在上述情况下,因为我试图改变自我的价值,然后红宝石应该炸掉。但它不会炸毁。

下面给出的是改变自我的尝试吹起来的情况。所以我的问题是为什么红宝石没有在上述情况下爆炸。

class Lab 
    def lab 
    puts self 
    self = 'Boom' #=> exception Can't change the value of self 
    puts self 
    end 
end 
+1

可能的重复[是Ruby通过引用还是按值传递?](http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value) – 2010-12-08 17:25:17

回答

4

的原因是一样的,为什么self不在此代码snipplet分配到的原因:

hello = self 
hello = 'foo' 

e是变量,指派别的东西,它只是分配别的东西给它,它不影响的当前值

+0

是一个克隆自我?由于红宝石使用通过引用,那么我会认为改变e会改变自我。 – 2010-12-10 05:21:18

2

但你不分配self,你分配一个局部变量e。当该块打开时,e指的是传入的对象self。然后e被重新分配以引用String实例。

相关问题