7

我发现很难理解 Ruby 中发送者和接收者的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的方法。但是,我知道我的理解还远远不够。谁能给我一个关于 Ruby 中发送者和接收者的具体解释?

4

6 回答 6

7

面向对象的一个​​核心概念是消息传递和早期的概念化,它大量借鉴了计算的 Actor 模型。Alan Kay,创造了面向对象一词并发明了最早的面向对象语言 SmallTalk 之一的人,对使用一个将重点放在对象而不是消息上的术语表示遗憾,他认为这是一个更强大的想法

在谈论消息时,自然会有消息的“发送者”和“接收者”。发送者是调用方法的对象,接收者是调用其方法的对象。在 Ruby 中,如果调用方法而不显式命名对象,则会将方法名称及其参数作为消息发送给默认接收者self

在 OO 中,“拨打电话”、“调用方法”和“发送消息”是等价的概念。类似地,“被调用”、“调用方法”和“接收消息”是等价的。

于 2013-03-23T23:09:03.483 回答
5

当你编写一个 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(举一个常见的例子),那么您将实例化一个客户端对象,您可以向该对象发送消息,例如“获取包含此主题标签的所有推文”。

于 2013-03-24T01:44:37.953 回答
4

举例说明:

考虑一下:

a = "test123"

a.reverse # => '321tset' 

用图表总结

reverse方法在 上“调用” a

讯息是什么?

  • “反向”是消息。您可以将消息视为基本方法。

什么是接收器?

  • 字符串a是消息的接收者

发件人是什么?

  • 发送者是调用所有这些的对象。在这种情况下,对象是self,即main
于 2016-09-23T07:12:58.510 回答
1

“1234”.reverse

  • 消息是“reverse”,它应该对应于一个称为 reverse 的方法。换句话说,您可以将方法视为“消息”。
  • 接收者是字符串对象“1234”
  • 发送者是调用该方法的对象。在这种情况下,它应该是(应该是自我)主要的。
于 2016-09-25T23:15:22.820 回答
0

这些术语来自 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是“接收者”。

于 2013-03-23T22:04:53.363 回答
0

我的猜测是您将“呼叫者”与“发送者”混淆了。我不知道在这种情况下“发件人”是什么。

一个方法可以有一个嵌入的方法:

def foo argument
  object.bar(argument)
end

在上述情况下,foo是 的调用者barobject是 的接收者bar

于 2013-03-23T21:50:18.763 回答