Ruby的自我定义

时间:2009-05-17 04:17:43

标签: ruby self

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

  

当前的自我接收对象   方法

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

编辑:我实际上非常清楚自己(及其应用程序)是什么,我知道如何在Google上搜索。我只是想知道是否有人可以解释我引用的定义。具体而言。

3 个答案:

答案 0 :(得分:20)

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

Ruby会将行my_string.length描述为“发送my_string length消息”。 my_string接收消息,因此被称为接收者;在length方法的定义中,self将引用my_string。您可以使用my_string.send(:length)获得相同的效果。

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

答案 1 :(得分:12)

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

请参阅Programming RubyMore About MethodsClasses and Objects

  

通过指定a来调用方法   接收器,方法的名称,和   可选的一些参数和   相关区块。

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

There is also a very good explanation here

答案 2 :(得分:4)

  

当前的自我接收对象   方法

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

some_object.some_method(args)

的简写
some_object.send(:some_method, args)

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

整个消息发送的东西是Ruby如此动态的一部分。它使对象很容易为当前未处理的消息定义method_missing,并决定如何处理它们。 Rails使用了很多:ActiveRecord,例如有“find_by ...”语法,它从名为/ sent的方法的名称中找出想要的内容。