簡體   English   中英

Ruby等效於python nonlocal

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM