gpt4 book ai didi

ruby - 如何使 block 局部变量成为 ruby​​ 1.9 中的默认值?

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:39 33 4
gpt4 key购买 nike

Ruby 1.9 提供了定义 block 本地变量的能力,并且不会关闭外部作用域中的同名变量:

x = 10
proc { |;x|
x = 20
}.call
x #=> 10

我希望将此行为作为我定义的某些 block 的默认行为 - 而不必使用 |;x, y, z|语法(注意分号)。

我认为 Ruby 本身不允许这样做,但是否可以破解此功能?

我目前有一个解决方案,但它非常丑陋,因为它需要检查以查看哪些局部变量在一个 block 的末尾发生了变化,然后将它们恢复到 block 之前的值。我不介意您的解决方案是否需要在 block 的开头指定哪些变量是 block 局部的,即 scope(:x) { x = 20 }

最佳答案

我选择的解决方案是基于 bobbywilson0 的想法。这是它的工作原理:

x = 99
y = 98

scope { |x, y|
x = 20
y = 30
}

x #=> 99
y #=> 98

这很有用,因为 scope 中使用的变量是在作用域开始时创建的,并且不会关闭在它之外定义的任何变量,它们也会在结束时被 GC范围。

实现如下:

def scope(&block)
num_required = block.arity >= 0 ? block.arity : ~block.arity
yield *([nil] * num_required)
end

此解决方案还考虑了默认值,使其在功能上等同于 lisp 中的 let*

scope { |x = 20, z = (x * 3)| 
x #=> 20
z #=> 60
}

我在这里发表了博客:http://banisterfiend.wordpress.com/2010/01/07/controlling-object-scope-in-ruby-1-9/

关于ruby - 如何使 block 局部变量成为 ruby​​ 1.9 中的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2002453/

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