如何将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>)
。