我有一個關於Ruby解釋如何分配變量問題:紅寶石在條件變量賦值「如果」修改
我用這個經常:
return foo if (foo = bar.some_method)
其中some_method返回一個對象或爲零。
然而,當我試試這個:
return foo if (true && (foo = bar.some_method))
我得到:NameError:對象:主未定義的局部變量或方法foo。
第一行和第二行之間的評估有什麼不同,導致第二行出錯?
我有一個關於Ruby解釋如何分配變量問題:紅寶石在條件變量賦值「如果」修改
我用這個經常:
return foo if (foo = bar.some_method)
其中some_method返回一個對象或爲零。
然而,當我試試這個:
return foo if (true && (foo = bar.some_method))
我得到:NameError:對象:主未定義的局部變量或方法foo。
第一行和第二行之間的評估有什麼不同,導致第二行出錯?
使用改性劑時,如果另一種常用混淆的情況是:
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
,它將無法正常工作。
該死的我以爲我刪掉了這個問題!我在發佈之後不久就意識到我已經在irb中定義了foo,當我測試了這個。我會留下這些證據,證明我沒有人願意學習。謝謝回答。 – jz999
因爲分配將在第二個變體中短路。但是,我不確定這是一種適合可讀性的模式。 –