我想在其“超类MySuperclass
”self.inherited
方法中访问一个类的名称。它对于由定义的具体类工作正常,class Foo < MySuperclass; end
但在使用匿名类时失败。我倾向于避免在测试中创建(类)常量。我希望它可以与匿名类一起使用。
给出以下代码:
class MySuperclass
def self.inherited(subclass)
super
# work with subclass' name
end
end
klass = Class.new(MySuperclass) do
def self.name
'FooBar'
end
end
klass#name
仍将是nil
whenMySuperclass.inherited
被调用的时间,就像在 Class.new
屈服其块并定义其方法之前那样。
我知道一个类在name
分配给常量时会得到它,但是有没有办法在Class#name
不创建常量的情况下设置“早期”呢?
我准备了一个更详细的代码示例,其中包含失败的测试,以说明期望的结果。
可能是在调用#yield
之后发生的::inherited
,我看到了与类定义类似的行为。但是,可以通过使用::klass
单例方法而不是::inherited
回调来避免这种情况。
def self.klass
@klass ||= (self.name || self.to_s).gsub(/Builder\z/, '')
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句