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

时间:2009-05-27 16:43:23

标签: ruby terminology

在下面的例子中,为什么我们说“k.send:hello”而不是“k.receive:hello”if,as stated elsewhere,k实际上是接收者?

声音就像k是发送者而不是接收者。

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

(你和我一样困惑吗?)

class Klass
  def hello
    "Hello!"
  end
end
k = Klass.new
k.send :hello   #=> "Hello"
k.hello         #=> "Hello"

3 个答案:

答案 0 :(得分:8)

在Smalltalk中,一切都是对象。 “发件人”是发起邮件的范围的所有者的对象(即“this”或“self”指针)。

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

答案 1 :(得分:6)

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

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

在此代码的最后一行中,main将marry发送给patty,而patty会自行发送last_name=并发送bob last_name

答案 2 :(得分:2)

我可以看到你感到困惑的地方,但这个问题在很大程度上是语义上的。您的论点是send方法应该是receive,因为k 接收消息(即k.receive :hello)。用简单的英语,你读k.send :hello为“k发送消息'你好'(对谁?)”,而不是“k发送消息'你好''。”

一个可以重命名方法“receive”,但这也有点用词不当,因为k可能收到消息 - {{ 1}}可能无法回复消息,k可能会选择忽略该消息,或k可能会选择将其传递给其他对象。在Ruby(和影响Ruby的Smalltalk)中,方法更像是请求来做某事,而不是命令来做。