"k.send:你好" - 如果k是"接收者",谁是发送者?

lor*_*orz 8 ruby terminology

在下面的例子中,为什么我们说"k.send:hello"而不是"k.receive:hello"如果,如其他地方所述,k实际上是接收器?

听起来像k是发送者,而不是接收器.

当我们说"k.send:你好"谁发送,如果不是k?

(你和我一样困惑吗?)

class Klass
  def hello
    "Hello!"
  end
end
k = Klass.new
k.send :hello   #=> "Hello"
k.hello         #=> "Hello"
Run Code Online (Sandbox Code Playgroud)

Ada*_*ght 8

在Smalltalk中,一切都是一个对象."发送者"是发起消息的范围的所有者的对象(即"this"或"self"指针).

和以前一样,Ruby继承了这个概念.在不太抽象的术语中,如果我给你发一封信,我就是"发件人"(它来自我的办公室),你就是"收件人"(前面的地址是你的).所以我写了foo.send myLetter:你,foo,收到我的信.发件人是隐式的,代码的所有者在进行"发布".

  • 这不仅仅是不同的术语.您可以发送没有相应方法的消息.您无法调用不存在的方法. (2认同)

Chu*_*uck 7

无论什么对象包含此代码都是发送消息 - 可能是主要的.让我们用更明确的对象和正常的消息传递来看待它.

class Person
  attr_accessor :first_name, :last_name
  def initialize(first_name, last_name)
    @first_name, @last_name = first_name, last_name
  end
  def marry(other)
    self.last_name = other.last_name
  end
end

bob = Person.new('Bob', 'Smith')
patty = Person.new('Patricia', 'Johnson')

patty.marry bob
Run Code Online (Sandbox Code Playgroud)

在这段代码的最后一行,main发送marry给patty,patty依次发送自己last_name=并发送bob last_name.

  • 发送者是发送消息的发送者的事实是该语言的先验事实.Smalltalk被认为是一堆通过消息相互通信的自治对象,Ruby继承了这一理念.如果您想要演示这里有两个不同的发件人,请致电`private:marry`.帕蒂仍然可以告诉自己结婚,但你的信息将被拒绝.或者做Array.new.<<(self)你会发现添加到数组中的self是发送对象,而不是数组本身. (2认同)