紅寶石學習筆記(四)
||= 運算子
由於 +=, -= 等運算子的語義,a ||= b 可能會被理解成 a = a || b。但實際上,Ruby 將其定義為 a || (a = b),這樣當 a 為真(即不為 nil 或 false)時就不會執行賦值操作。
What Ruby’s ||= (Double Pipe / Or Equals) Really Does 這篇文章的一個測試非常好:
h = {}
def h.[]=(k, v)
puts "Setting hash key #{k} with #{v.inspect}"
super
end
# 1. The standard ||= approach
h[:x] ||= 10
h[:x] ||= 20
# 2. The a = a || b approach
h[:y] = h[:y] || 10
h[:y] = h[:y] || 20
# 3. The a || a = b approach
h[:z] || h[:z] = 10
h[:z] || h[:z] = 20
輸出為:
Setting hash key x with 10
Setting hash key y with 10
Setting hash key y with 10
Setting hash key z with 10
還有一個 &&= 運算子,與 ||= 類似,語義是 a && a = b。
for 的視野
出乎意料,for 並沒有開啟一個新的視野,所以在 for 的區塊中定義的變數在區塊之外仍然有效。因此,Ruby 風格指南 中建議使用迭代器 (iterator) 取代之。
類似地, if, while, case 等也沒有開啟新的視野。