我发现很难理解Ruby中发送者和接收者的实际含义。他们一般意味着什么?到目前为止,我只是将它们理解为方法调用以及获取其返回值的方法。但是,我知道我的理解远远不够。任何人都可以在Ruby中给我一个发送者和接收者的具体解释吗?
答案 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
在上述情况中,foo
是bar
的来电者。 object
是bar
的接收者。
答案 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