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

如何理解Ruby中的发送方和接收方?,ruby,Ruby,我发现很难理解Ruby中发送者和接收者的实际含义。一般来说,它们是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。然而,我知道我的理解远远不够。有人能用Ruby给我一个关于发送者和接收者的具体解释吗 我猜你把“呼叫者”和“发送者”混淆了。我不知道在这种情况下“发送者”是什么 方法可以具有嵌入式方法: def foo argument object.bar(argument) end 在上述情况下,foo是bar的调用者对象是条的接收器这些术语来自Smalltalk教授

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

我猜你把“呼叫者”和“发送者”混淆了。我不知道在这种情况下“发送者”是什么

方法可以具有嵌入式方法:

def foo argument
  object.bar(argument)
end

在上述情况下,
foo
bar
的调用者<代码>对象是
条的接收器

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

说“obj.do\u somthing”的便捷方式实际上是当前的“自我”发送消息“嘿,obj,请做点什么”。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
是“接受者”。面向对象的一个核心概念是消息传递,早期的概念化借鉴了计算的参与者模型。艾伦·凯(Alan Kay)创造了面向对象这个术语,并发明了最早的OO语言SmallTalk之一,他已经成功了

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


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

当你编写一个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)交互的复杂程序时(举一个常见的例子),您将实例化一个客户端对象,您可以向其发送消息,如“获取包含此标签的所有tweets”。

示例说明: 考虑这一点:

a = "test123"
现在,让我们调用
a
上的
reverse
方法

a.reverse # => '321tset' 
什么信息?
  • “反转”是消息。您可以将消息视为基本的方法
接收器是什么?
  • 字符串
    a
    是消息的接收者
寄件人是什么?
  • 发送方是调用所有这些的对象。在这种情况下,对象是
    self
    ,即
    main
这是我制作的一张图表,可能会对您有所帮助:

希望能把它清理干净。

“1234”。反过来说

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

foo
不是上述
bar
的发送者
foo
是一个对象的方法,该对象就是发送方。它在从某处接收消息
:foo、参数
后执行其方法
foo
时,将消息
:bar
发送给接收者
对象。与“调用者”和“接收者”不同,“发送者”在Ruby中似乎不是一个定义良好的概念。尽管如此,FWIW认为“发送者”是在称为方法的任何代码块中的
self
对象。但是sawa是正确的--
foo
是调用者。这是一个坏例子,因为
a
中存储的对象是外部调用中的接收者(
a.foo(b)
),而
b
中存储的对象是
a\foo
中的接收者(即
obj
中的
obj.send(:object\u id)
)。换句话说,a和obj是第8行和第3行中的接收器。在这段代码中,当执行第3行时,a是发送方。实际上,在第6行和第7行中,a和b是“=”方法的接收者,a和Object是“new”方法的接收者。@MarkDBlackwell:Ruby中没有
=
方法。局部变量赋值不是消息发送(因此也不是面向对象的!!!),如果没有消息,谈论“发送者”和“接收者”都没有意义。但是,如果将赋值实现为消息发送,那么接收方将是当前词法范围,
a
b
将是消息发送的参数。毕竟,它们在被分配之前并不存在,所以你会如何向它们发送消息?IOW:
foo=42
相当于类似于
binding.local\u variable\u set(:foo,42)
。例如,它在Ioke和Seph中就是这样工作的
foo=42
只是
=(foo,42)
的语法糖,即将带有(未计算!)参数
foo
42
的消息
=
发送给默认接收者,默认接收者不是
self
,而是当前的计算上下文。同样,在没有变量的Newspeak中,
foo::=42
是“在curre上创建一对getter和setter方法
foo
的语法糖