4

我注意到在大多数情况下都需要点表示法来调用对象的方法。我假设点是用来连接对象和方法名的,但是在算术运算中,数字对象和它的操作方法之间有一个空格。例如,

7.-(5)

使用点符号,也可以写成

7 - 5

在运算符和操作数之间有可选的空格。它如何能够执行方法调用?

4

4 回答 4

5

Syntactic Sugar for Special Methods了解红宝石所有语法糖的好来源。

以下所有内容在 Ruby 中都是相同的。

2 + 3   #=> 5
2.+(3)  #=> 5
2.+ 3 #=> 5

所以当你写的时候2 + 3,它是在内部发生2.+(3)2.+ 3

因为 Ruby 中的一切都是对象。这里2也是一个Fixnum对象。随着.我们调用对象2+方法,就是这样。

2.class #=> Fixnum
2.instance_of? Fixnum #=> true
2.respond_to? :+  #=> true

另一个例子如下:

"a" + "b" #=> "ab"
"a".+"b" #=> "ab"
"a".respond_to? :+ #=> true

respond_to返回true- 这是因为String类具有连接方法+。作为 String 类的对象,可以通过作为参数传递给该方法'a'来调用该方法。+b

于 2013-04-12T22:29:58.500 回答
2

那么[数字对象]如何能够执行方法调用?

number 对象不必自己弄清楚,Ruby 会在内部处理它。它适用于任何对象,而不仅仅是数字:

class Foo
  def +(arg)
    puts "adding #{arg}"
  end
end

Foo.new + "bar"
# => adding bar
于 2013-04-12T23:17:39.103 回答
0

虽然 Ruby 比 Python 更正交,但这并不意味着它是完全正交的。所以,它也有它的异常,例如,它还有一个for关键字(被翻译为对每个的调用):

for x in (1..3) do
  puts x
end

仅仅因为它拥有它,并不意味着它对你有好处。没有人真正推荐使用类似的方法for,因为最好使用each,因为我相信您已经阅读过。

使用调用+方法.或将消息发送+到您的对象是不值得做的事情,只是为了保持语言真正、真正、正交。

您可以看到 Ruby 的语法,如果您对此方面感兴趣,这可能会帮助您找到其他非正交方面。

于 2013-04-12T22:33:41.703 回答
0

它如何能够执行方法调用?

嗯,这叫做语法糖。这真的没什么特别的。这只是常见的 ruby​​ 方法调用规则的一个例外,以便使代码更易于理解和可能可读。

你会比理解7.-(5)得更快7 - 5吗?我不这么认为。这就是存在此异常的原因。

这是可能的,因为 Ruby 解释器读取 anyx - y并将其翻译x.-y为.x[y]x.[](y)x[y] = zx.[]=(y, z)

这是所有语法糖调用符号的列表:

在此处输入图像描述

图片来自一本非常好的书,名为The Well-Grounded Rubyist,它在第 2 部分第 7 章中介绍了这个概念。

于 2013-04-13T02:11:08.807 回答