如何将string转换为类方法?

这是如何将string转换为Rails / Ruby中的类:

p = "Post" Kernel.const_get(p) eval(p) p.constantize 

但是,如果我正在从一个数组/活动logging对象中检索一个方法,如:

 Post.description 

但它可能是

 Post.anything 

其中任何东西都是类似于anything = "description"的string。

这是有用的,因为我想重构一个非常大的类,并减less代码和重复的行。 我怎样才能使它工作?

 Post.send(anything) 

虽然eval可以成为这类事情的有用工具,但是来自其他背景的人可能会像开jar头的人一样频繁地使用它,但是这样使用起来真的很危险。 Eval意味着如果你不小心,任何事情都可能发生。

一个更安全的方法是这样的:

 on_class = "Post" on_class.constantize.send("method_name") on_class.constantize.send("method_name", arg1) 

对象#发送将调用任何你想要的方法。 您可以发送一个符号或string,并提供该方法是不是私人或保护,应该工作。

由于这是一个Ruby on Rails问题,我将稍微详细说明一下。

在Rails 3中,假设title是一个ActiveRecord对象上的一个字段的名称,那么以下内容也是有效的:

 @post = Post.new method = "title" @post.send(method) # => @post.title @post.send(method+'=',"New Name") # => @post.title = "New Name" 

尝试这个:

 class Test def method_missing(id, *args) puts "#{id} - get your method name" puts "#{args} - get values" end end a = Test.new a.name('123') 

所以一般的语法是a.<anything>(<any argument>)