【发布时间】:2023-04-01 23:46:01
【问题描述】:
我在阅读一本 Ruby 书籍时遇到了伪变量 self 的这个定义:
self - 当前的接收者对象 方法
谁能打破这个定义并解释它的含义?一点都不懂。
编辑:我实际上对 self 是什么(及其应用程序)有一个很好的了解,并且我知道如何在 Google 上进行搜索。我只是想知道是否有人可以解释我引用的定义。具体来说。
【问题讨论】:
我在阅读一本 Ruby 书籍时遇到了伪变量 self 的这个定义:
self - 当前的接收者对象 方法
谁能打破这个定义并解释它的含义?一点都不懂。
编辑:我实际上对 self 是什么(及其应用程序)有一个很好的了解,并且我知道如何在 Google 上进行搜索。我只是想知道是否有人可以解释我引用的定义。具体来说。
【问题讨论】:
Ruby 和其他语言(例如 Smalltalk 和 Objective-C)更喜欢术语“消息传递”,而 Java 和 C++ 更喜欢“方法调用”。也就是说,“Java 方式”是调用对象的方法——在对象的上下文中运行代码——而“Ruby 方式”是向对象发送消息,对象通过运行其方法来响应该消息。
Ruby 将my_string.length 描述为“发送my_stringlength 消息”。 my_string 接收消息,因此称为接收者;在length 方法的定义中,self 将引用my_string。使用my_string.send(:length)也可以达到同样的效果。
从消息传递的角度考虑这个概念比从方法调用的角度考虑更灵活。要调用对象上的方法,该方法必须已预先定义,而您可以向对象发送一条消息,它可以选择动态处理(使用respond_to? 和method_missing)。这种灵活性是允许将 Ruby 用作简洁的领域特定语言 (DSL) 的一个方面。
【讨论】:
self 是一个特殊变量,会根据上下文而变化。更具体地说,它是当前方法的接收器对象,正如您所提到的。要理解这一点,我们需要了解接收者的含义。
见Programming Ruby:More About Methods和Classes and Objects。
你通过指定一个方法来调用一个方法 接收者,方法的名称,和 可选的一些参数和一个 关联块。
connection.downloadMP3("jitterbug") { |p| showProgress(p) }
在本例中,对象
connection是接收者,downloadMP3是 方法的名称,"jitterbug"是 参数,以及之间的东西 大括号是关联的块。
foo = "hello"
bar = foo.dup
class <<foo
def to_s
"The value is '#{self}'"
end
def twoTimes
self + self
end
end
foo.to_s » "The value is 'hello'"
foo.twoTimes » "hellohello"
bar.to_s » "hello"
在foo.twoTimes中,foo部分被称为方法调用的接收者。
因此,在twoTimes 方法中,self 指的是上下文中的对象foo。
【讨论】:
self - 当前的接收者对象 方法
Ruby 中的“方法调用”是通过消息发送机制完成的。所以
some_object.some_method(args)
是
的简写some_object.send(:some_method, args)
我认为这就是引用的意思:“self”是消息(或方法)已发送到的对象:当前方法的接收者。
整个消息发送是 Ruby 如此动态的部分原因。它使对象可以轻松地为它当前不处理的消息定义method_missing 并决定如何处理它们。 Rails 经常使用这个:例如,ActiveRecord 有“find_by...”语法,它从被调用/发送的方法的名称中找出想要的东西。
【讨论】: