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

时间:2017-09-26 00:29:55

标签: ruby

我有以下代码示例:

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,并且创建了类。

1 个答案:

答案 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)并非绝对必要。