是否有可能在继承中获取匿名类的name ,而不引发“失败A”? 应该通过创建Class对象来完成(没有eval或类似的对象)。

class A
  def self.inherited(base)
    raise 'fail A' unless base.name
  end
end

B = Class.new(A)
# or
Object.const_set :B, Class.new(A)

上面的代码不起作用,因为匿名类尚未初始化,因此无法将其设置为特定的常量。

===============>>#1 票数:5

没有。

在将匿名类分配给常量之前,它没有名称(例如(B = Class.new).name #=> "B" )。 由于分配是直到创建了类实例之后才进行的(在此期间调用了钩子,包括inherited钩子),因此直到此后才能获得名称。

===============>>#2 票数:1

怎么样呢?

class Superclass
  def self.inherited(base)
    raise 'Invalid class name' unless @forced_anonymous_subclass_name == :A
  end
  def self.forced_anonymous_subclass_name
    @forced_anonymous_subclass_name
  end
  def self.with_forced_anonymous_subclass_name(class_name)
    @forced_anonymous_subclass_name = class_name
    yield
  ensure
    @forced_anonymous_subclass_name = nil
  end
end

sc = Superclass

sc.with_forced_anonymous_subclass_name(:A) do
  Object.const_set sc.forced_anonymous_subclass_name, Class.new(sc)
end #=> A

sc.with_forced_anonymous_subclass_name(:B) do
  Object.const_set sc.forced_anonymous_subclass_name, Class.new(sc)
end #=> RuntimeError

随意询问是否不清楚/改进/等。

  ask by Dmitry Polushkin translate from so

未解决问题?本站智能推荐:

关注微信公众号