2014-02-12 39 views
2

我有一個關於Ruby解釋如何分配變量問題:紅寶石在條件變量賦值「如果」修改

我用這個經常:

return foo if (foo = bar.some_method) 

其中some_method返回一個對象或爲零。

然而,當我試試這個:

return foo if (true && (foo = bar.some_method)) 

我得到:NameError:對象:主未定義的局部變量或方法foo。

第一行和第二行之間的評估有什麼不同,導致第二行出錯?

+2

因爲分配將在第二個變體中短路。但是,我不確定這是一種適合可讀性的模式。 –

回答

7

Read it carefully

使用改性劑時,如果另一種常用混淆的情況是:

p a if a = 0.zero? 

而不是打印true收到一個NameError,「未定義局部變量或方法 'A'」。由於紅寶石首先分析if的左側a左側,並且尚未看到指定它假定您希望調用方法。 Ruby然後看到分配a並且將假定您引用了local method

混淆來自無序執行表達式首先分配本地變量 - 然後嘗試調用不存在的方法。

正如你所說 - 無return foo if (foo = bar.some_method)return foo if (true && (foo = bar.some_method))將工作,我敢打賭,如果你沒有在此行之前定義foo,它將無法正常工作。

+2

該死的我以爲我刪掉了這個問題!我在發佈之後不久就意識到我已經在irb中定義了foo,當我測試了這個。我會留下這些證據,證明我沒有人願意學習。謝謝回答。 – jz999