2010-05-11 40 views
2

假设我有一个名为的类Klass,以及一个名为的类Klass2。根据用户的输入,我想决定我是否会在克拉斯称"hello_world",或Klass2:字符串的类别

class Klass 
    def self.hello_world 
    "Hello World from Klass1!" 
    end 
end 

class Klass2 
    def self.hello_world 
    "Hello World from Klass2!" 
    end 
end 

input = gets.strip 
class_to_use = input 
puts class_to_use.send :hello_world 

用户输入“Klass2”和脚本应该说:

你好来自Klass2的世界!

显然,这代码不工作,因为我号召字符串#hello_world,但我想打电话#hello_worldKlass2

我如何“转换”字符串到Klass2(或任何用户可能输入)的引用,或者我怎么能实现这种行为?

回答

11
puts Object.const_get(class_to_use).hello_world 
+1

是更好地使用'Object.const_get'?我从来没有用过它...... tks! :] – 2010-05-11 14:26:44

1
puts eval(class_to_use).hello_world 
+7

'eval'总是有点不安全,可以通过'const_get'来避免。另外,不需要使用'send',因为我们已经知道我们会调用'hello_world'方法。 – 2010-05-11 14:55:50

+0

为什么它不安全?我删除了“发送”...完全错过了。谢谢。 – 2010-05-11 15:19:49

+1

@j:'eval'让用户运行任意的Ruby代码。他们可以做的不仅仅是选课。 – 2010-05-11 15:30:50

1

如果你的ActiveSupport(在Rails应用程序例如)加载,你也可以使用#constantize:

class_to_use.constantize.hello_world 
相关问题