我讀通過編程紅寶石,語用程序員指南(該鋤書),作者聲稱,有之間的差異:a = a ||之間的區別b和a || = B
var = var || "Default Value"
和:
var || = "Default Value"
我不明白這一點,因爲與我所看到的沒有什麼不同。誰能幫我這個?
我讀通過編程紅寶石,語用程序員指南(該鋤書),作者聲稱,有之間的差異:a = a ||之間的區別b和a || = B
var = var || "Default Value"
和:
var || = "Default Value"
我不明白這一點,因爲與我所看到的沒有什麼不同。誰能幫我這個?
引述資源here:
在A = A || b,a在每次運行中由語句設置爲 ,而用||表示。 a = b,只有a在邏輯上爲假時才設置a(即,如果它爲零或假,則爲 ),因爲||是'短路'。也就是說,如果 ||的左側比較是真的,沒有必要 檢查右邊。
這基本上意味着它們的行爲與開發人員的行爲類似,但內部實現方式與上述不同。
編輯: 正如在評論中指出,上面的解釋認爲a || a = b
而不是a ||= b
。非常好的一點,並閱讀相同的鏈接進一步闡明瞭這一點:
如果a沒有定義, a = 42引發NameError,而|| = 42 返回42.因此,它們似乎不是等效表達式。
因此,它們又不是同一個語句,因爲Ruby在分析時看到賦值的那一刻就分配了一個變量(這是a ||= 42
的情況)。
最後一個報價,所以你不要以爲我在做這件事,:)
紅寶石看到在分析階段的任務,並在某種程度上創建變量 表示不會與一個|| a = 42,即使它結束了 的行爲就像後者一旦發生實際執行。
class Foo def var puts 'Foo#var called' @var end def var=(value) puts 'Foo#var= called' @var = value end end
你的第一個例子的結果
Foo#var=
被稱爲非常時間:f = Foo.new f.var = f.var || "Default Value" # Foo#var called # Foo#var= called f.var = f.var || "Default Value" # Foo#var called # Foo#var= called
而在你的第二個
如果你使用一類具有getter和setter的差別變得更加明顯例如,Foo#var=
僅被稱爲一次:
f = Foo.new
f.var ||= "Default Value"
# Foo#var called
# Foo#var= called
f.var ||= "Default Value"
# Foo#var called
據我所知,這兩個表達式對於'var'的任何值都有相同的結果?您能否在書中添加一段引文來提問您的問題,以表明作者的含義? :-) – Drenmi
我認爲它只是寫出同樣表達的兩種方式。 – Atri
你們很酷。謝謝 – gates