Ruby 为什么我在给自己分配任务时没有出错

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

基于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 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
相同对象的引用,但这并不意味着它们中的任何一个实际上就是它们引用的对象)。