1

私が書いていたプログラムでいくつかの結果に出くわし、それが私を混乱させました。私の理解では、parensは通常は必要ありません(つまりobj.method1.method2、と同じくらい良い(obj.method1).method2です)。さらに、すべての演算子は実際にはメソッド呼び出しであるため、同じように動作することを期待していました。

だから、私の驚きを想像してみてください。しかし、最終的には期待された出力が得"S"+"R".downcaseられました。Sr"S".+"R".downcase"S".send(:+, "R").downcasesr

これは、オペレーターのショートカットの扱いが異なるためですか、それとも私が行方不明になっている他のメカニックがここで働いているためですか?


編集:質問は、答えをもたらした操作の順序に関するものではありません。それは明らかです。問題は、なぜ式がこの順序で解決されたのかということでした。

4

2 に答える 2

4

.よりも優先順位が高く+、最初に評価されます。("S"+"R").downcaseも動作します。

于 2012-05-29T10:48:41.503 に答える
1

Ruby> = 1.9の場合、これがRipperでどのように解析されるかを調べることができます。

require 'ripper'
require 'pp'

src = '"A"+"B".downcase'
pp Ripper::SexpBuilder.new(src).parse

('。'からの)メソッド呼び出しの優先順位がバイナリプラスよりも高いことがわかります。

[:program,
 [:stmts_add,
  [:stmts_new],
  [:binary,
   [:string_literal,
    [:string_add, [:string_content], [:@tstring_content, "A", [1, 1]]]],
   :+,
   [:call,
    [:string_literal,
     [:string_add, [:string_content], [:@tstring_content, "B", [1, 5]]]],
    :".",
    [:@ident, "downcase", [1, 8]]]]]]

bison / yaccに精通している場合は、演算子の優先順位をRubyのparse.yから直接導出することもできます。

于 2012-05-29T11:00:23.117 に答える