{ puts 'lambda1' } lambda2 = -> { puts 'lambda2 calls lambda-6ren">
gpt4 book ai didi

ruby - 如何 "glue in"另一个 lambda 体内的 lambda?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:24 25 4
gpt4 key购买 nike

假设我在 Ruby 中有这样两个 lambda:

lambda1 = -> { puts 'lambda1' }
lambda2 = -> {
puts 'lambda2 calls lambda1'
lambda1.()
}

它按预期工作:

lambda1.()
# lambda1
lambda2.()
# lambda2 calls lambda1
# lambda1

但是现在如果我删除 lambda1lambda2 将停止工作:

lambda1 = nil
lambda2.()

NoMethodError: undefined method `call' for nil:NilClass

我可以做些什么来将我的 lambda1“粘合”到 lambda2 以使第一个成为第二个的固有部分并避免这种情况?

最佳答案

问题是您的 lambda2 在闭包中捕获了变量 lambda1,因此当 lambda1 稍后更改时它会注意到。解决方案只是让它捕获不同的变量:

lambda1 = -> { puts 'lambda1' }
x = lambda1 # copy the reference
lambda2 = -> { x.() }
lambda1 = nil
lambda2.()

“但这也有同样的问题!”你可能会说,“我可以通过重新分配 x 来打破它!”那么让 x 受范围保护:

def wrap x
-> { x.() }
end

lambda1 = -> { puts 'lambda1' }
lambda2 = wrap lambda1
lambda1 = nil
lambda2.()

关于ruby - 如何 "glue in"另一个 lambda 体内的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50685346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com