gpt4 book ai didi

来自外部作用域的 Ruby 变量在 block 中未定义 - 为什么?

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

这部分代码动态创建了几个类:

(1..MAX_ACT).each do |act_id|
klass = Class.new(ActB) do
def initialize(trg)
super(trg, act_id)
end
end
Object.const_set("Act#{act_id}", klass)
end

在这种情况下,公共(public)基类 (ActB) 有一个带两个参数的构造函数,而子类有一个带一个参数的构造函数。

运行这段代码效果很好,但是当我稍后尝试实例化这些类之一时,例如

Act3.new(4)

我收到错误信息

NameError: undefined local variable or method `act_id' for #<Act3:0x00000006008b7990>

错误信息必须引用行

super(trg, act_id)

因为这是我的程序中唯一使用这个变量的地方。然而,这个变量是在上面几行定义的,当它说

(1..MAX_ACT).each do |act_id|

我曾预料到,do...end block 会为构造函数创建一个闭包,其中绑定(bind)了 act_id。然而,情况似乎并非如此。

为什么我的示例不起作用?我该如何正确地做到这一点?

最佳答案

def(以及 classmodule)创建一个新的局部作用域,它不从外部继承任何局部变量。

所以你是对的,Class.new do .. end 创建了一个闭包...但是内部 def 不共享它。

如果您需要标准的 block 行为,您可以使用 define_method 代替:

(1..MAX_ACT).each do |act_id|
klass = Class.new(ActB) do
define_method :initialize do |trg|
super(trg, act_id)
end
end
Object.const_set("Act#{act_id}", klass)
end

关于来自外部作用域的 Ruby 变量在 block 中未定义 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824516/

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