我有一个静态方法的 set 类。类集的示例成员:
class George
def self.ugh()
printf( "Hello world\n" )
end # self.ugh()
end # class george
我需要做以下事情,但我没有我需要的东西。
p George.object_id
我正在使用的代码传递了类名(aka var)。我发现了一个 看似丑陋的解决方案,但它确实有效。
var = "George" # What I have
cmd = "#{var}.object_id"
p eval( cmd ) # right object_id
我认为有更好的方法。好像红宝石错过了一个 s_to_class()方法。
我找到的唯一其他想法,但是无效。
klass = class << var; self; end
p klass.object_id # wrong object_id
klass = var.singleton_class()
p klass.object_id # wrong object_id
任何人都知道从a获取类对象(aka接收器)的更好方法 串/符号?
答案 0 :(得分:4)
如果您有可用的话,ActiveSupport会提供constantize
方法。否则,请使用Module#const_get
。有关详细信息,请参阅this question。
答案 1 :(得分:1)
您可以更改eval
使用情况,使其略微恶化:
className = "George"
klass = eval(className)
klass.objectId
但更重要的是,为什么要传递类名而不是自己传递类?类“定义”只是Ruby中的对象,你可以像传递任何其他类型的对象一样传递它们。
答案 2 :(得分:0)
似乎eval是您寻求的字符串到类方法:
eval("George").object_id
答案 3 :(得分:0)
class A; end
id1 = A.object_id
id2 = Object.const_get("A").object_id
puts id1 == id2 #=> true