2012-11-21 20 views
10

我正在運行Ruby 1.9。「OR」操作員必須放在上一行的末尾? (意外的tOROP)

這是一個有效的語法:

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'] |... 
     ^

爲什麼?

回答

8

我可以說的是「那它是如何工作的。」

Ruby語法分析器通常在確定表達式何時需要在另一行上繼續運行時的功能非常出色。世界上幾乎所有其他語言都會在這個問題上徹底解決問題,並且需要一個實際的角色來繼續下一行或終止該語句。如你所知,Ruby在這方面非常特別,幾乎總是它只是計算出來的。

在這種情況下,雖然存在衝突。解析器知道你的表達沒有完成,因爲它仍然在尋找),但它可能是一個複合表達式。

例如,你可以寫這樣的:

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

...但使用新行軟終結,而不是; ......下面這句法不實際工作:

(p :a 
p :b 
p :c) 

(順便說一句,該表達式的值是序列中最後一個表達式的值。)

Ruby無法解析您的語句和上面的語句出一個更好的提示,比如一個二元運算符,顯然需要另一條線。

+0

我不確定是否「驚人的工作」是正確的(我認爲這是*奇數*因爲表達式*可以由下一行中的操作符繼續)*,但*它是如何定義Ruby語言(疣和所有)+1。 (JavaScript對此有不同的處理方式 - 也許更多的是「預計」 - 對ASI有一些限制性產品。) – 2012-11-21 22:21:11

+1

實際上:Scala和Python--也不需要分號 - *也*處理這個問題,也許「預計」 ,與Ruby相比。他們不支持後者的答案(括號和沒有聲明分隔符),這是一個奇怪的構造)。 – 2012-11-21 22:38:51

4

Ruby將行尾作爲語句的結尾。運營商表示繼續發表聲明。

你可以用反斜槓\指示延續以及因此下面的工作

items = (data['DELETE'] || data['delete'] \ 
    || data['GET'] || data['get'] || data['POST'] || data['post']) 
相關問題