覆盖'+'方法

时间:2013-02-27 14:13:59

标签: ruby

在理解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'

这是因为运营商优先吗?

3 个答案:

答案 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一样古老和广泛使用的软件中,这些错误和角落案例也会不时出现。