在理解ruby的过程中,我试图用默认参数值覆盖'+'。这样的事情。
class C
def something(a = 5)
puts "Received: #{a}"
end
def +(b = 10)
puts "Received: #{b}"
end
end
现在
x = C.new
x.something #=> Received: 5
x.something(88) #=> Received: 88
x.+ #=> IRB shows ? whereas I was expecting an output 'Received: 10'
这是因为运营商优先吗?
答案 0 :(得分:4)
IRB问题(看起来它没有处理这种情况)。如果您创建单独的.rb文件并运行它,您将获得预期的输出:
Received: 5
Received: 88
Received: 10
答案 1 :(得分:2)
IRB正在解析+
并期望二进制操作的第二个参数。如果你提供括号,它可以正常工作:
x.+() #=> Received: 10
答案 2 :(得分:1)
IRb使用与Ruby不同的解析器。因此,在一些奇怪的角落情况下,IRb可能会以不同于Ruby的方式解析代码。如果你想看看某些东西是否是有效的Ruby,你应该问Ruby而不是IRb。
原因主要是Ruby总是一次解析整个文件,所以它总是知道表达式何时结束。另一方面,IRb必须在每次按 ENTER 时“猜测”是否只是想在新行上继续表达式,或者是否要按原样评估表达式。因此,IRb 不能只使用Ruby解析器,它需要有自己的解析器。 Ruby的语法非常复杂,编写自己的解析器真的很难。这就是为什么即使在一个像IRb一样古老和广泛使用的软件中,这些错误和角落案例也会不时出现。