3 回答

TA貢獻(xiàn)1946條經(jīng)驗 獲得超4個贊
以下代碼使我感到驚訝。我認(rèn)為這是一個危險的陷阱:既容易遇到,又難以調(diào)試。
(1..5).each do |number|
comment = " is even" if number%2==0
puts number.to_s + comment.to_s
end
打?。?/p>
1
2 is even
3
4 is even
5
但是如果我在塊之前添加comment =任何內(nèi)容 ...
comment = nil
(1..5).each do |number|
comment = " is even" if number%2==0
puts number.to_s + comment.to_s
end
然后我得到:
1
2 is even
3 is even
4 is even
5 is even
基本上,當(dāng)僅在塊內(nèi)部定義變量時,然后在塊末尾銷毀該變量,然后nil在每次迭代時將其重置為。通常就是您所期望的。但是如果變量是該塊之前所定義,然后將外變量用于塊內(nèi),并且它的值是因此迭代之間持久的。
一種解決方案是改為編寫此代碼:
comment = number%2==0 ? " is even" : nil
我認(rèn)為很多人(包括我在內(nèi))傾向于寫“ a = b if c”而不是“ a = (c ? b : nil)”,因為它更具可讀性,但顯然有副作用。
- 3 回答
- 0 關(guān)注
- 623 瀏覽
添加回答
舉報