我注意到在大多数情况下都需要点表示法来调用对象的方法。我假设点是用来连接对象和方法名的,但是在算术运算中,数字对象和它的操作方法之间有一个空格。例如,
7.-(5)
使用点符号,也可以写成
7 - 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
那么[数字对象]如何能够执行方法调用?
number 对象不必自己弄清楚,Ruby 会在内部处理它。它适用于任何对象,而不仅仅是数字:
class Foo
def +(arg)
puts "adding #{arg}"
end
end
Foo.new + "bar"
# => adding bar
虽然 Ruby 比 Python 更正交,但这并不意味着它是完全正交的。所以,它也有它的异常,例如,它还有一个for
关键字(被翻译为对每个的调用):
for x in (1..3) do
puts x
end
仅仅因为它拥有它,并不意味着它对你有好处。没有人真正推荐使用类似的方法for
,因为最好使用each
,因为我相信您已经阅读过。
使用调用+
方法.
或将消息发送+
到您的对象是不值得做的事情,只是为了保持语言真正、真正、正交。
您可以看到 Ruby 的语法,如果您对此方面感兴趣,这可能会帮助您找到其他非正交方面。
它如何能够执行方法调用?
嗯,这叫做语法糖。这真的没什么特别的。这只是常见的 ruby 方法调用规则的一个例外,以便使代码更易于理解和可能可读。
你会比理解7.-(5)
得更快7 - 5
吗?我不这么认为。这就是存在此异常的原因。
这是可能的,因为 Ruby 解释器读取 anyx - y
并将其翻译x.-y
为.x[y]
x.[](y)
x[y] = z
x.[]=(y, z)
这是所有语法糖调用符号的列表:
图片来自一本非常好的书,名为The Well-Grounded Rubyist,它在第 2 部分第 7 章中介绍了这个概念。