3
我想更好地瞭解Ruby的封鎖和我碰到這個例子的代碼,我不太明白傳來:瞭解Ruby的瓶蓋
def make_counter
n = 0
return Proc.new { n = n + 1 }
end
c = make_counter
puts c.call # => this outputs 1
puts c.call # => this outputs 2
有人可以幫助我瞭解什麼是真正在上面的代碼時發生我打電話c = make_counter
?在我看來,這是我的想法:
Ruby調用make_counter
方法並返回一個Proc對象,其中與Proc關聯的代碼塊將爲{ n = 1 }
。當執行第一個c.call
時,Proc對象將執行與其關聯的塊,並返回n = 1
。但是,當執行第二個c.call
時,Proc對象是否仍然執行與其關聯的塊,該塊仍然是{ n = 1 }
?我不明白爲什麼輸出將變成2
也許我不理解這一點在所有,這將是有益的,如果你能提供什麼在Ruby中實際發生的情況作一些澄清。
「......最早的PROC關閉外部聲明「並不是一個很好的解釋。 Proc閉包外有很多地方不在Proc範圍內。這只是因爲當Proc被創建時'n'在範圍內。 – 2013-02-15 04:40:20
@AndrewMarshall,通過「Proc閉包之外」,我只是意味着解析器第一次出現在範圍內的'n'不在Proc內部。當然,引用必須在範圍爲它被包含在結合 - 我曾以爲這是顯而易見的...... – PinnyM 2013-02-15 04:44:06
很抱歉,如果這可能是乏味的,但讓我嘗試解釋一下你在我說過的話,並請讓我知道這是否正確:根據定義,代碼塊中的變量n綁定到代碼塊外部的n。這意味着當與Proc關聯的代碼塊通過c.call進行評估時,代碼塊將執行n = n + 1(將1分配給n)並返回1.當與Proc關聯的塊被執行時第二次,它會再次執行n = n + 1,但是這次因爲n現在是1,塊將返回2.我是否正確地解釋了它? – wmock 2013-02-15 04:53:08