今天我遇到了一段有趣的代碼。這更像是一個關于 ruby?? 決議器的科學問題。我們知道 ruby?? 中的一切都是一個物件,并且每個運算式的計算結果至少為nil。但是如何決議以下“分配”:
somevar
NameError: undefined local variable or method 'somevar' for main:Object
somevar = "test" if false
=> nil
somevar
=> nil
您會看到變數未定義,直到在賦值中使用它。但是由于條件,分配沒有發生。還是因為條件評估為零而發生?我嘗試了一些在這種情況下會中斷的東西,但它確實有效:
a = {}
a[1/0]
ZeroDivisionError: divided by 0
a[1/0] = "test" if false
=> nil
那么這是否意味著按照它的方式作業?或者defined?(somevar)在訪問之前測驗變數 ( )是否有意義,以防未來版本的 ruby?? 會破壞這種行為?例如,將分配的指標保存到此變數。我目前使用的 ruby?? 版本是 3.0.2。
uj5u.com熱心網友回復:
這是 Ruby 中的預期行為。參考自Ruby 檔案:
區域變數在決議器遇到賦值時創建,而不是在賦值發生時創建:
a = 0 if false # does not assign to a p local_variables # prints [:a] p a # prints nil
uj5u.com熱心網友回復:
如果你這樣做,= "test" if false它的計算結果是nil=> 不需要賦值。但是通過打電話somevar = ...你告訴口譯員宣告名字somevar。的nil是不一樣的(如果是有道理的)。
[]然而,運算子不宣告變數(僅訪問),但由于if false不是真的,因此沒有賦值,因此不會評估整個左側。
考慮:
a = [1,2,3]
a[1] = "test" if false
a
=> [1,2,3]
a[1] 既不是零也不是測驗。
不確定您的期望或未來 Ruby 將如何打破這一點?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330624.html
上一篇:是否可以保持非字母符號完好無損?
下一篇:Ruby傳遞符號作為關鍵字引數?
