Ruby的自我定义

Dev*_*ted 13 ruby self

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

当前方法的自我接收对象

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

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

jma*_*mah 21

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

红宝石将介绍该行my_string.length的"发送my_stringlength信息".在my_string接收到该消息,并且因此被称为接收器; 在length方法的定义里面,self会参考my_string.您可以获得相同的效果my_string.send(:length).

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


Eug*_*ota 14

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

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

通过指定接收器,方法名称以及可选的一些参数和关联的块来调用方法.

connection.downloadMP3("jitterbug") { |p| showProgress(p) }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,对象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"
Run Code Online (Sandbox Code Playgroud)

foo.twoTimes,foo部分称为方法调用的接收者.因此,在twoTimes方法中,self引用foo上下文中的对象.

这里也有很好的解释