10

Ruby 1.9 を実行しています。

これは有効な構文です。

items = (data['DELETE'] || data['delete'] ||
         data['GET'] || data['get'] || data['POST'] || data['post'])

しかし、これは私にエラーを与えます:

items = (data['DELETE'] || data['delete']
         || data['GET'] || data['get'] || data['POST'] || data['post'])

t.rb:8: syntax error, unexpected tOROP, expecting ')'
         || data['GET'] || data['get'] |...
           ^

どうして?!

4

3 に答える 3

8

私が言えるのは、「それがまさにその仕組み」です。

Rubyパーサーは、一般に、式を別の行に続ける必要がある場合を把握するという驚くべき仕事をします。世界の他のほぼすべての言語は、この問題を完全に回避し、次の行に進むか、ステートメントを終了するために実際のキャラクターを必要とします。

ご存知のように、Rubyはその点で特別であり、ほとんどの場合、Rubyはそれを理解するだけです。

ただし、この場合、競合が発生します。パーサーは、まだを探しているため、式が終了していないことを認識しています)が、複合式である可能性があります。

たとえば、次のように書くことができます。

(p :a; p :b; p :c)

...しかし、代わりに改行ソフトターミネータを使用すると;...以下の構文は実際に機能します:

(p :a
 p :b
 p :c)

(ところで、その式の値は、シーケンスの最後の式の値です。)

Rubyは、明らかに別の行を必要とする二項演算子などのより良いヒントがなければ、ステートメントと上記のステートメントの両方を解析できません。

于 2012-11-21T22:03:14.090 に答える
4

Rubyは、行末をステートメントの終わりとして解釈します。演算子は、ステートメントの継続を示します。

バックスラッシュ\を使用して継続を示すこともできるので、以下が機能します

items = (data['DELETE'] || data['delete'] \
     || data['GET'] || data['get'] || data['POST'] || data['post'])
于 2012-11-21T22:02:32.850 に答える
2

rubyは行指向であるため、演算子で終わるステートメントは不完全であると解釈されます。演算子の後に円記号を追加すると、複数行のステートメントを正しく解釈できるようになります。(出典: http: //phrogz.net/ProgrammingRuby/language.html

于 2012-11-21T22:03:50.330 に答える