2011-12-07 139 views
12

如果我這樣做:爲什麼這不是語法錯誤?

(false true) 

失敗有語法錯誤,如我所料。但是,如果我這樣做:

(false 
true) 

的代碼被執行,並且它扔掉的首要條件和返回第二個結果。

這被認爲是一個錯誤或功能?

+8

'(假,真)' –

+2

我知道必須有一個簡單的解釋。你應該把這個作爲一個真實的答案,並聲稱自己有一些功勞。 :-) – L2G

回答

15

行尾是可選的,所以在這種情況下,返回導致解析器將其解釋爲以下幾點:

(false; true) 

,其評價只是:

(true) 

如果這些方法那麼兩個電話都會被評估,但只有最後一個會被髮射。例如:

x = (p "hello" 
p "world" 
2) 

這將輸出「你好」和「世界」和X將等於2個

7

圓括號用於分組,換行符被用作表達分離器。所以,你在這裏只是一組兩個表達式。沒有什麼可以拒絕的。

這是有用的,因爲這個著名的成語:

def foo(bar = (bar_set = true; :baz)) 
    if bar_set 
    # optional argument was supplied 
    end 
end 

我們根本Ruby中沒有其他辦法找出一個可選的參數是否提供或沒有。

基本上,這成爲副作用,如在@ 32bitkid的實例分配在我的例子或印刷用的變量設置爲屏幕的存在有趣。在你的例子中,沒有副作用,這就是爲什麼你看不到什麼實際上正在進行。

+0

其實,這個成語對我來說是新的,所以我很感謝你的回答! – L2G

+0

@ L2G:它並不經常使用,但有一些標準協議要求區分是否提供了可選參數。 'inject'就是一個例子。通常它是用C或Java或C#實現的,具有對解釋器內部特權的訪問,這使得檢查可選參數的存在變得容易。但是如果你想在純Ruby中複製它的行爲,你必須使用這樣的技巧。 –

2

如果你有警告,Ruby會給你一個警告。

$VERBOSE = true 
def foo 
    (false 
    true) 
end 

給你

(irb):3: warning: unused literal ignored 

在這兩個1.9.1補丁號378和Ruby 1.8.7 PATCHLEVEL 330

How can I run all Ruby scripts with warnings?對於如何與預警運行所有Ruby腳本。