如何在ruby中获取类常量名称

时间:2015-09-12 16:50:13

标签: ruby reflection

我需要从中得到不变的名字:

class Sex
    Male = 1
    Female = 2
end

但这是完美的变体,至少可以从这个名称得到恒定名称:

class Sex
    self.Male = 1
    self.Female = 2
end

关于这个问题的几个细节:

  • 您可以获取方法列表:Class.methods - Object.methods
  • 您可以获取实例变量列表:instance_variables.map{|ivar| instance_variable_get ivar}
  • 您可以从模块获取常量名称列表:Module.constants

但我不知道如何获得 class 常量名称。

2 个答案:

答案 0 :(得分:1)

class Sex
  Male = 1
  Female = 2
end

这定义了Sex类上的两个常量。 SexClass的一个实例,Class的超类是Module

c = Sex.class  # => Class
c.superclass   # => Module

您已经知道如何从模块中获取常量名称数组作为符号,并且由于此方法是继承的,您可以在Sex类上调用它:

Sex.constants  # => [:Male, :Female]

我不确定你的第二个例子。假设你的意思是这个(read about class << self):

class Sex
  class << self
    Male = 1
    Female = 2
  end
end

这在Sex类的singleton class上定义了两个常量。方法Object#singleton_class返回对象的单例类。之后methodsinstance_variablesconstants可以通常的方式调用:

Sex.singleton_class.constants  # => [:Male, :Female]

答案 1 :(得分:1)

您可以在constants对象上使用Class以及如下所示

class Sex
    Male = 1
    Female = 2
end

p Sex.constants # will return [:Male, :Female]

它起作用的原因是Module恰好是Class

的基类
p Sex.class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]