如果我這樣做:爲什麼這不是語法錯誤?
(false true)
失敗有語法錯誤,如我所料。但是,如果我這樣做:
(false
true)
的代碼被執行,並且它扔掉的首要條件和返回第二個結果。
這被認爲是一個錯誤或功能?
如果我這樣做:爲什麼這不是語法錯誤?
(false true)
失敗有語法錯誤,如我所料。但是,如果我這樣做:
(false
true)
的代碼被執行,並且它扔掉的首要條件和返回第二個結果。
這被認爲是一個錯誤或功能?
行尾是可選的,所以在這種情況下,返回導致解析器將其解釋爲以下幾點:
(false; true)
,其評價只是:
(true)
如果這些方法那麼兩個電話都會被評估,但只有最後一個會被髮射。例如:
x = (p "hello"
p "world"
2)
這將輸出「你好」和「世界」和X將等於2個
圓括號用於分組,換行符被用作表達分離器。所以,你在這裏只是一組兩個表達式。沒有什麼可以拒絕的。
這是有用的,因爲這個著名的成語:
def foo(bar = (bar_set = true; :baz))
if bar_set
# optional argument was supplied
end
end
我們根本Ruby中沒有其他辦法找出一個可選的參數是否提供或沒有。
基本上,這成爲副作用,如在@ 32bitkid的實例分配在我的例子或印刷用的變量設置爲屏幕的存在有趣。在你的例子中,沒有副作用,這就是爲什麼你看不到什麼實際上正在進行。
其實,這個成語對我來說是新的,所以我很感謝你的回答! – L2G
@ L2G:它並不經常使用,但有一些標準協議要求區分是否提供了可選參數。 'inject'就是一個例子。通常它是用C或Java或C#實現的,具有對解釋器內部特權的訪問,這使得檢查可選參數的存在變得容易。但是如果你想在純Ruby中複製它的行爲,你必須使用這樣的技巧。 –
如果你有警告,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腳本。
'(假,真)' –
我知道必須有一個簡單的解釋。你應該把這個作爲一個真實的答案,並聲稱自己有一些功勞。 :-) – L2G