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 は を解析して+おり、二項演算の 2 番目のパラメーターを期待しています。括弧を指定すると、正しく機能します。

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

IRb は Ruby とは異なるパーサーを使用します。そのため、まれに、IRb が Ruby とは異なる方法でコードを解析することがあります。何かが有効な Ruby かどうかを確認したい場合は、IRb ではなく Ruby に問い合わせてください。

これの主な理由は、Ruby が常に一度にファイル全体を解析するため、式がいつ終了するかを常に認識しているからです。ENTER一方、IRb は、新しい行で式を継続するだけなのか、それとも式をそのまま評価したいのかを押すたびに「推測」する必要があります。そのため、IRbは Ruby パーサーをそのまま使用することはできず、独自のパーサーを用意する必要があります。また、Ruby の文法は非常に複雑であるため、独自のパーサーを作成するのは非常に困難です。そのため、IRb のように古くて広く使用されているソフトウェアであっても、このようなバグやまれなケースがときどき発生します。

于 2013-02-27T14:56:22.137 に答える