如何理解Ruby中的发送者和接收者?

我发现很难理解Ruby中发送者和接收者的实际含义。 它们一般意味着什么? 到目前为止,我只是将它们理解为方法调用以及获取其返回值的方法。 但是,我知道我的理解远远不够。 任何人都可以在Ruby中给我一个发送者和接收者的具体解释吗?

当你编写一个Ruby程序并告诉字符串反转自己时,你就是发送者而字符串对象就是接收者。 例如,

 "this is a string".reverse "this is a string".send(:reverse) # equivalent 

作为编码人员,你正在做的是发送一条消息:反向该字符串对象,即该消息的接收者,输出将是

 => "gnirts a si siht" 

这是返回值。

您可以查询对象是否可以处理您要发送的消息:

 "this is a string".respond_to?(:reverse) => true Hash.new.respond_to?(:reverse) => false 

这是完全来自irb的最简单的例子。 当你编写可能与其他API交互的复杂程序时,比如Twitter(以一个常见的例子),那么你将实例化一个客户端对象,你可以发送消息,如“获取包含此主题标签的所有推文”。

考虑一下:

 a = "test123" 

现在让我们在这个字符串上“反向调用一个方法”。

 a.reverse ## '321tset' #everything is backwards 

什么是接收器? 消息是什么? 发件人是什么?

  • 消息是“反向”。 您可以将消息视为基本方法。 换句话说,每条消息对应一种方法。
  • 字符串a是消息的接收者
  • 发件人是调用所有这些内容的对象。 在这种情况下,对象是self ,这是main

希望能搞清楚。

我的猜测是你把“来电者”弄为“发件人”。 我不知道在这种情况下“发件人”是什么。

一种方法可以有一个嵌入式方法:

 def foo argument object.bar(argument) end 

在上面的例子中, foobar的调用者。 objectbar的接收者。

这些术语来自Smalltalk所教导的面向对象的基本概念。 记住:一切都是对象。 对象可以交互的唯一方法是通过发送彼此的消息。

obj.do_somthing的便捷方式实际上是当前self发送消息“嘿obj,请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是“接收者”。

“1234” .reverse

  • 消息是“反向”,它应该对应于一个名为reverse的方法。 换句话说,您可以将该方法视为“消息”。
  • 接收器是字符串对象“1234”
  • 发件人是调用方法的对象。 在这种情况下,它应该是(自我应该是)主要的。