我需要从中获取常量名称:
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
对象上使用constants
,如下所示
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]
class Sex
Male = 1
Female = 2
end
这在Sex
类上定义了两个常量。Sex
是Class
的实例,Class
的超类是Module
:
c = Sex.class # => Class
c.superclass # => Module
您已经知道如何从模块中获得作为符号的常量名称数组,并且由于此方法是继承的,因此您可以在Sex
类上调用它:
Sex.constants # => [:Male, :Female]
我不确定你的第二个例子。假设你是认真的(阅读class << self
(:
class Sex
class << self
Male = 1
Female = 2
end
end
这在Sex
类的singleton类上定义了两个常量。方法Object#singleton_class
返回对象的singleton类。之后,methods
、instance_variables
或constants
可以用通常的方式调用:
Sex.singleton_class.constants # => [:Male, :Female]