我有以下代码示例:
drop_class = eval "class #{self}::LiquidDropClass < Liquid::Drop; self; end"
我理解它在做什么,但我不明白为什么在类定义中返回self
。这甚至是必要的,还是eval类定义方法的假象?
在这种情况下,方法稍后会添加到课程中。
更新 我的困惑在于:
class XYZ:::LiquidDropClass < Liquid::Drop
end
VS
eval "class XYZ::LiquidDropClass < Liquid::Drop; self; end"
我不需要第一个例子中的self,并且创建了类。
答案 0 :(得分:3)
类(和模块)定义体的值(注意,类定义体是一个表达式,因此有一个值;实际上,Ruby中的所有是一个表达式,因此具有一个值,没有语句)是在类定义体内计算的最后一个表达式的值。如果self
不是特定类定义主体中的最后一个表达式,则类定义主体将为空,因此其值为nil
,即{ {1}}将是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
)并非绝对必要。