我一直在阅读与闭包相关的文章,我认为我理解了它们,但是为了不让自己和别人感到困惑,我希望有人能够简洁明了地解释一下闭包。我正在寻找一个简单的解释,可能有助于理解何时何地以及为什么要使用它们。
我已经看了很多关于闭包的资料,对此有了一定的了解,但为了避免混淆自己和他人,我希望有人可以尽可能简明地解释一下闭包。我希望得到一个简单的解释,帮助我理解何时何地以及为什么使用它们。
我一直在阅读与闭包相关的文章,我认为我理解了它们,但是为了不让自己和别人感到困惑,我希望有人能够简洁明了地解释一下闭包。我正在寻找一个简单的解释,可能有助于理解何时何地以及为什么要使用它们。
我已经看了很多关于闭包的资料,对此有了一定的了解,但为了避免混淆自己和他人,我希望有人可以尽可能简明地解释一下闭包。我希望得到一个简单的解释,帮助我理解何时何地以及为什么使用它们。
def closure(x):
def counter():
nonlocal x
x += 1
return x
return counter;
counter1 = closure(100);
counter2 = closure(200);
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))
# result
i from closure 1 101
i from closure 1 102
i from closure 2 201
i from closure 1 103
i from closure 1 104
i from closure 1 105
i from closure 2 202
def makefunction (x)
def multiply (a,b)
puts a*b
end
return lambda {|n| multiply(n,x)} # => returning a closure
end
func = makefunction(2) # => we capture the closure
func.call(6) # => Result equal "12"
即使"multiply"方法和"x"变量不再存在,它仍然可以工作。这是因为闭包具有记忆能力。
我曾经看到的最好的闭包解释是解释机制。 大概是这样的:
将程序堆栈想象成一个退化的树,其中每个节点只有一个子节点,而单个叶节点是当前正在执行的过程的上下文。
现在放松每个节点只能有一个子节点的限制。
如果这样做,您可以拥有一个构造(“yield”),它可以从过程返回而不丢弃本地上下文(即在返回时不会将其弹出堆栈)。 下次调用该过程时,调用会接收旧的堆栈(树)帧,并继续执行离开的地方。