6

簡単に言えば、私はオプション引数を含むメソッドを書いていました。これは、キー:ifの値がtrueと評価された場合に特定の処理を実行します。新しい構文を使用してIRBでハッシュを試行すると、IRBで構文エラーが発生しましたが、プロンプトは開いたままになります。

1.9.3p374 :010 > {if: true}
1.9.3p374 :011?>

古い構文を使用すると、問題なく機能します。

1.9.3p374 :011 > {:if => true}
 => {:if=>true} 

ステートメントを開始するすべてのキーワードは、同じ動作を示します。例def、、、、do_ module_case

途中で発生し、問題なく機能するその他の予約語classelseend

私の質問は次のとおりです。これは予想される動作ですか、バグですか、それとも制限ですか?

4

1 に答える 1

6

あらゆる言語で物事を確実かつ明確に解析することは困難です。これは、予約語を使い始めるときに特に当てはまります。そして、irbそれを超えて、パーサーの上にインタラクティブなモデルを提供する必要がありますが、これはさらに困難です。個人的には、このような場合を心配することは、言語のユーザーとしても、保守者としても、それほど価値があるとは思いません。私の考えでは、何が機能するかを単純に理解し、可能であればこれらの状況に陥らないようにする方がよいでしょう。

の外にあるプレーンなRubyでも同様の動作を見ることができますirb。例えば:

puts({if: true})  # no problem, behaves as expected in Ruby 1.9.3.
puts {if: true}   # raises a syntax error in Ruby 1.9.3

あなたの質問に答えるには、それは「予想される動作、バグ、または制限」ですか、無視irbしてプレーンなRubyと比較する必要があります。これを行うと、正常に機能します。それはそれがirbバグでなければならないことを意味します。

しかし、解決することは可能ですか、それとも価値がありますか?irb@coreywardは、ほとんどの場合、。に遭遇したときに実行を遅らせる必要があるという彼のコメントの良い点を示していifます。確実に知るためにはさらに調べる必要がありますが、このようなすべてのケースを明確に解釈できるとは限りません。

私のアドバイス:可能であればこの構成を完全に避け、回避できる場合はラベルに予約語を使用しないでください!

これは、プレーンなRuby(MRIなど)で実行できるファイルです。{:if=>true}それが機能することを確認するために出力を見る必要があります。

{if: true}
foo = {if: true}
# if MRI is working, should be able to execute this file without trouble.
p foo
于 2013-02-19T20:55:28.073 に答える