gpt4 book ai didi

ruby - 为什么要在 eval'd 类定义中返回 self?

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

我有以下代码示例:

drop_class = eval "class #{self}::LiquidDropClass < Liquid::Drop; self; end"

我明白它在做什么,但我不明白为什么在类定义中返回 self。这是必要的,还是 eval 类定义方法的产物?

在这种情况下,方法是稍后添加到类中的。

更新我对此感到困惑:

class XYZ:::LiquidDropClass < Liquid::Drop

end

对比

eval "class XYZ::LiquidDropClass < Liquid::Drop; self; end"

我不需要第一个示例中的 self,类创建得很好。

最佳答案

类(和模块)定义体的值(注意,类定义体是一个表达式,因此具有一个值;事实上,Ruby 中的一切都是一个表达式,因此具有一个值,没有语句)是在类定义主体中计算的最后一个表达式的值。如果 self 不是 特定类定义主体中的最后一个表达式,则类定义主体将为空,因此它的值为 nil,即 drop_class 将为 nil

在将 Object#singleton_class 添加到核心库之前,获取对单例类的引用的惯用方法是打开单例类并将其计算为 self,例如:

class Object
def singleton_class; class << self; self end end
end

请注意,这段特定的代码实际上并不需要 eval,它也可以(并且可能更清晰)写成(未经测试):

drop_class = class const_get(to_s)::LiquidDropClass < Liquid::Drop; self end

实际上,在这两种情况下,类也可以通过其他方式检索,因此将其分配给 drop_class(从而评估 self)并不是绝对必要的。

关于ruby - 为什么要在 eval'd 类定义中返回 self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46416080/

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