我有两个班级
class ClassOne
def do_something
[...]
end
end
class ClassTwo
def do_something
[...]
end
end
我从数据库中获取了一个类名(ClassOne或ClassTwo),我想在该类中调用do_something
所以我有
class_name = "ClassOne"
如果class_name等于“ClassTwo”,我想调用ClassOne.do_something
或ClassTwo.do_something
。
我不能使用简单的if条件,我有很多类,并且在调用之前检查类是否存在..
有办法吗?
答案 0 :(得分:6)
对于香草红宝石:
Kernel.const_get('ClassOne').do_something
对于Rails:
'ClassOne'.constantize.do_something
答案 1 :(得分:2)
虽然您可以使用ActiveSupport中的constantize
将任意字符串转换为类(如果可用),但如果用户可以提交相关字符串,则可能会导致异常。使用case
:
case (with_class)
when 'ClassOne', 'ClassTwo'
with_class.constantize.do_something
else
raise "Um, what are you doing?"
end
使用哈希或数组定义有效类并相应地使用[]
或include?
进行测试,可以实现同样的目的。
答案 2 :(得分:-1)
eval("#{classname}.do_something")
注意:您必须将代码更改为def self.do_something
,否则这些是实例方法。看起来这是你的意图。