“k.send:你好” – 如果k是“接收者”,谁是发送者?
在下面的例子中,为什么我们说“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"
无论什么对象包含此代码都是发送消息 – 可能是主要的。 让我们用更明确的对象和正常的消息传递来看待它。
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发送给patty marry
,而patty依次发送自己last_name=
并发送bob last_name
。
在Smalltalk中,一切都是一个对象。 “发送者”是发起消息的范围的所有者的对象(即“this”或“self”指针)。
和以前一样,Rubyinheritance了这个概念。 在不太抽象的术语中,如果我给你发信,我就是“发件人”(它来自我的办公室),你就是“收件人”(前面的地址是你的)。 所以我写了foo.send myLetter:你,foo,收到我的来信。 发件人是隐式的,代码的所有者在进行“发布”。
我可以看到你在哪里感到困惑,但这个问题在很大程度上是语义上的。 你的论点是send
方法应该真正receive
,因为k
正在接收一条消息(即k.receive :hello
)。 用简单的英语,你读k.send :hello
为“k发送消息’hello’(对谁?)”,而不是“k被发送给消息’你好””。
可以重命名方法“接收”,但这也有点用词不当,因为k
可能没有收到消息 – k
可能不响应消息, k
可能选择忽略它,或者k
可能选择传递它到另一个对象。 在Ruby(和影响Ruby的Smalltalk)中,方法更像是做某事的请求 ,而不是执行它的命令 。