我发现很难理解 Ruby 中发送者和接收者的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的方法。但是,我知道我的理解还远远不够。谁能给我一个关于 Ruby 中发送者和接收者的具体解释?
6 回答
面向对象的一个核心概念是消息传递和早期的概念化,它大量借鉴了计算的 Actor 模型。Alan Kay,创造了面向对象一词并发明了最早的面向对象语言 SmallTalk 之一的人,对使用一个将重点放在对象而不是消息上的术语表示遗憾,他认为这是一个更强大的想法。
在谈论消息时,自然会有消息的“发送者”和“接收者”。发送者是调用方法的对象,接收者是调用其方法的对象。在 Ruby 中,如果调用方法而不显式命名对象,则会将方法名称及其参数作为消息发送给默认接收者self
。
在 OO 中,“拨打电话”、“调用方法”和“发送消息”是等价的概念。类似地,“被调用”、“调用方法”和“接收消息”是等价的。
当你编写一个 Ruby 程序并告诉一个字符串自己反转时,你是发送者,而字符串对象是接收者。例如,
"this is a string".reverse
"this is a string".send(:reverse) # equivalent
作为编码人员,您正在做的是向该字符串对象发送一条消息 :reverse,该字符串对象是该消息的接收者,输出将是
=> "gnirts a si siht"
这是返回值。
您可以查询一个对象是否可以处理您要发送的消息:
"this is a string".respond_to?(:reverse)
=> true
Hash.new.respond_to?(:reverse)
=> false
这完全是玩 irb 的最简单的例子。当您编写可能与其他 API 交互的复杂程序时,例如 Twitter(举一个常见的例子),那么您将实例化一个客户端对象,您可以向该对象发送消息,例如“获取包含此主题标签的所有推文”。
“1234”.reverse
- 消息是“reverse”,它应该对应于一个称为 reverse 的方法。换句话说,您可以将方法视为“消息”。
- 接收者是字符串对象“1234”
- 发送者是调用该方法的对象。在这种情况下,它应该是(应该是自我)主要的。
这些术语来自 Smalltalk 教授的面向对象的基本概念。记住:一切都是对象。对象可以交互的唯一方式是通过相互发送消息。
方便的说法obj.do_somthing
其实就是当前self
发送消息“hey obj, please do_something”。obj 的 do_something 方法的返回值可以看作是该消息的答案。
class A
def foo(obj)
obj.send(:object_id)
end
end
a = A.new
b = Object.new
a.foo(b)
=> 4232
在这个例子a
中是“发送者”并且b
是“接收者”。
我的猜测是您将“呼叫者”与“发送者”混淆了。我不知道在这种情况下“发件人”是什么。
一个方法可以有一个嵌入的方法:
def foo argument
object.bar(argument)
end
在上述情况下,foo
是 的调用者bar
。object
是 的接收者bar
。