13

我正在阅读一本 Ruby 书籍,并遇到了伪变量 self 的这个定义:

当前方法的self-receiver对象

有人可以打破这个定义并解释它的含义吗?我一点都不明白。

编辑:我实际上对 self 是什么(及其应用程序)有一个很好的了解,并且我知道如何在 Google 上搜索。我只是想知道是否有人可以解释我引用的定义。具体就是这样。

4

3 回答 3

22

Ruby 和其他语言(例如 Smalltalk 和 Objective-C)更喜欢术语“消息传递”,而 Java 和 C++ 更喜欢“方法调用”。也就是说,“Java 方式”是调用对象上的方法——在对象的上下文中运行代码——而“Ruby 方式”是向对象发送消息,对象通过运行其方法来响应该消息。

Ruby 将该行描述为my_string.length“发送消息”。接收消息的,称为接收者;在方法的定义里面,会引用. 你可以得到同样的效果。my_stringlengthmy_stringlengthselfmy_stringmy_string.send(:length)

从消息传递的角度考虑这个概念比从方法调用的角度考虑更灵活。要调用对象上的方法,该方法必须已预先定义,而您可以向对象发送可以选择动态处理的消息(使用respond_to?and method_missing)。这种灵活性是允许 Ruby 用作简洁的领域特定语言 (DSL) 的一个方面。

于 2009-05-17T09:06:18.470 回答
14

self是一个特殊变量,根据上下文而变化。更具体地说,它是当前方法的接收器对象,正如您所提到的。要理解这一点,我们需要了解接收者的含义。

请参阅Ruby 编程有关方法类和对象的更多信息。

您可以通过指定接收者、方法名称以及可选的一些参数和关联块来调用方法。

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是上下文中的对象。

这里也有很好的解释

于 2009-05-17T04:35:50.650 回答
4

当前方法的self-receiver对象

Ruby 中的“方法调用”是通过消息发送机制完成的。所以

some_object.some_method(args)

是的简写

some_object.send(:some_method, args)

我认为这就是引用的意思:“self”是消息(或方法)已发送到的对象:当前方法的接收者。

整个消息发送是 Ruby 如此动态的部分原因。它使对象可以很容易地定义method_missing它当前不处理的消息并决定如何处理它们。Rails 经常使用它:例如,ActiveRecord 有“find_by...”语法,它从被调用/发送的方法的名称中找出想要的东西。

于 2009-05-17T09:07:32.103 回答