[英]Ruby equivalent of python nonlocal
我試圖用Ruby編寫閉包。 這是用Python編寫的代碼:
def counter():
x = 0
def increment(y):
nonlocal x
x += y
print(x)
return increment
Ruby中是否有一個“非本地”等效項,因此我可以從增量中訪問變量x並對其進行更改?
也許像這樣:
class CGroup
def counter
@x ||= 0
lambda do |y|
@x += y
end
end
end
然后:
group = CGroup.new
c = group.counter
c.call(1)
=> 1
c.call(1)
=> 2
我不知道Python的nonlocal
的直接模擬。
編輯 :實例變量是不必要的,並且可以使用方法本地的變量來實現相同的目的。 這使得該類成為多余的,盡管Ruby中的很多事情都是在對象的上下文中發生的。
由於有人反對使用對象,為什么不只使用lambda?
counter_generator = ->(){
x ||= 0
->(y){
x += y
puts x
}
}
i = counter_generator.call
=> #<Proc:0x00000100867508@(irb):17 (lambda)>
i.call(1)
1
=> nil
i.call(1)
2
=> nil
注意,增量器實際上返回nil,因為您僅指定輸出x的值,而不返回它。
nonlocal
關鍵字告訴Python要捕獲哪些變量。 在Ruby中,您不需要這樣的關鍵字:除非另有明確說明,否則將捕獲所有變量。
因此,相當於Python代碼的Ruby幾乎可以直接轉換:
counter = -> {
x = 0
->y {
x += y
puts x
}
}
i = counter.()
i.(2)
# 2
i.(3)
# 5
不過,使用counter
方法可能會更慣用:
def counter
x = 0
->y {
x += y
puts x
}
end
i = counter
i.(2)
# 2
i.(3)
# 5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.