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

时间:2013-03-23 21:27:13

标签: ruby

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

6 个答案:

答案 0 :(得分:7)

面向对象的核心概念是消息传递和早期概念化,大量借鉴了Actor计算模型。创造“面向对象”一词并发明了第一个OO语言SmallTalk之一的Alan Kay拥有voiced regret at using a term which put the focus on objects instead of on messages, which he considered the stronger idea

在谈论消息时,消息中有一个自然的“发送者”和“接收者”。 sender是调用方法的对象,receiver是调用方法的对象。在Ruby中,如果在没有显式命名对象的情况下调用方法,则会将方法名称及其args作为消息发送到默认接收方self

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

考虑一下:

a = "test123"

现在让我们来调用一种方法"反转,在这个字符串上。

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

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

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

希望能够解决它。

答案 3 :(得分:0)

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

方法可以有嵌入式方法:

def foo argument
  object.bar(argument)
end

在上述情况中,foobar的来电者。 objectbar的接收者。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

“1234” .reverse

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