Ruby 为什么我在给自己分配任务时没有出错
基于tap的工作原理与此类似,我同意Ruby 为什么我在给自己分配任务时没有出错,ruby,Ruby,基于tap的工作原理与此类似,我同意 class Object def tap yield self self end end 这是我的实验 class Lab end puts Lab.new.tap {|e| e = 'Boom' } 在上面的例子中,因为我试图改变self的值,所以ruby应该爆炸了。但它不会爆炸 下面给出了一个试图改变自我的例子。所以我的问题是为什么ruby在上述情况下没有爆炸 class Lab def lab puts sel
class Object
def tap
yield self
self
end
end
这是我的实验
class Lab
end
puts Lab.new.tap {|e| e = 'Boom' }
在上面的例子中,因为我试图改变self的值,所以ruby应该爆炸了。但它不会爆炸
下面给出了一个试图改变自我的例子。所以我的问题是为什么ruby在上述情况下没有爆炸
class Lab
def lab
puts self
self = 'Boom' #=> exception Can't change the value of self
puts self
end
end
但是您没有分配
self
,而是分配了一个局部变量e
。当块打开时,e
引用传入的对象self
。然后重新分配e
以引用字符串实例。但您没有分配self
,而是分配了一个局部变量e
。当块打开时,e
引用传入的对象self
。然后重新分配e
以引用字符串实例。原因与此代码片段中未分配self
的原因相同:
hello = self
hello = 'foo'
e
只是一个变量,给它赋值只是给它赋值,它不会影响e的当前值。原因与此代码snipplet中未赋值的原因相同:
hello = self
hello = 'foo'
e
只是一个变量,给它赋值只是给它赋值,它不会影响e的当前值。e的可能复制是自我的克隆吗?由于ruby使用pass-by-reference,所以我认为更改e会更改self。e
是一个包含对self的引用的变量。当为e
分配其他内容时,变量包含对其他内容的引用。这里重要的是e
是一个变量,变量是对对象的引用,它们不是对象self
是Ruby不允许指定的特殊变量,可以将其视为常量(但请记住,变量可以包含对常量引用的同一对象的引用,因此e
可以是对与self
相同对象的引用,但这并不意味着它们中的任何一个实际上就是它们引用的对象).e是self的克隆吗?既然ruby使用pass by reference,那么我认为更改e会更改self。e
是一个包含self引用的变量。当为e
分配其他内容时,该变量包含其他内容的引用。e
是一个变量,变量是对对象的引用,它们不是对象。self
是Ruby不允许指定的特殊变量,可以将其视为常量(但请记住,变量可以包含对常量引用的同一对象的引用,因此e
可以是对与self
相同对象的引用,但这并不意味着它们中的任何一个实际上就是它们引用的对象)。