0

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

这是因为运算符优先级吗?

4

3 回答 3

4

IRB 的问题(看起来它不处理这种情况)。如果您创建单独的 .rb 文件并运行它,您将获得预期的输出:

Received: 5
Received: 88
Received: 10
于 2013-02-27T14:20:28.733 回答
2

IRB 正在解析+并期待二进制操作的第二个参数。如果您提供括号,它可以正常工作:

x.+()  #=> Received: 10
于 2013-02-27T14:31:45.247 回答
1

IRb 使用与 Ruby 不同的解析器。因此,在一些奇怪的极端情况下,IRb 解析代码的方式可能与 Ruby 不同。如果你想查看某个东西是否是有效的 Ruby,你应该问 Ruby 而不是 IRb。

这样做的原因主要是 Ruby 总是一次解析整个文件,所以它总是知道表达式何时结束。另一方面,IRb 必须在每次按下时“猜测”ENTER您是只想在新行上继续表达式还是要按原样评估表达式。因此,IRb不能只使用 Ruby 解析器,它需要有自己的。而且 Ruby 的语法非常复杂,编写自己的解析器真的很难。这就是为什么即使在像 IRb 一样古老且广泛使用的软件中也会不时出现此类错误和极端情况的原因。

于 2013-02-27T14:56:22.137 回答