Ruby 版本:ruby 2.6.7p197(2021-04-05 修訂版 67941)[x86_64-linux]
Rails gem 版本:6.0.1
簡單的問題,我在 rails 控制臺上有這個例子
正如預期的那樣,如果我嘗試呼叫不存在的變數,則會出現錯誤
irb(main):007:0> value
# Traceback (most recent call last):
# 2: from (irb):7
# 1: from (irb):7:in `rescue in irb_binding'
# NameError (undefined local variable or method `value' for main:Object)
但是,如果我嘗試執行以下示例
(value = 1) if value.present?
由于某種原因它回傳 nil,第一個場景沒有括號,我認為它是定義變數然后回傳 nil 值,但后來我嘗試使用它并再次發生(我嘗試了其他變數,因為 ruby?? 計數作為一個定義的變數)
OBS:我在原始 irb 上嘗試了相同的場景,但它引發了一個錯誤,這只發生在 rails 控制臺上
編輯:它只引發了一個錯誤,因為我沒有意識到 '.present?' 是一種 rails 方法,但是如果我將語法更改為
(value = 1) if value
發生同樣的行為
Why does that happen? Shouldn't a NameError be raised?
uj5u.com熱心網友回復:
Ruby 以這種方式作業,請查看檔案
區域變數是在決議器遇到賦值時創建的,而不是在賦值發生時創建的:
a = 0 if false # does not assign to a p local_variables # prints [:a] p a # prints nil
還有其他有趣的事情:
另一個常見的令人困惑的情況是使用修飾符時,如果:
p a if a = 0.zero?您收到的不是列印“true”,而是
NameError, “undefined local variable or method 'a'”. 由于 ruby?? 首先決議了 if 的左側,并且還沒有看到對 a 的賦值,所以它假設您希望呼叫一個方法。Ruby 然后看到分配給 a 并假設您正在參考本地方法。混亂來自運算式的無序執行。首先區域變數被賦值,然后你嘗試呼叫一個不存在的方法。
所以你可以
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/424103.html
