如何将字符串转换为类方法?

kgp*_*per 38 ruby ruby-on-rails

这是如何将字符串转换为Rails/Ruby中的类:

p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
Run Code Online (Sandbox Code Playgroud)

但是,如果我从数组/活动记录对象中检索方法,如下所示:

Post.description
Run Code Online (Sandbox Code Playgroud)

但它可能是

Post.anything
Run Code Online (Sandbox Code Playgroud)

什么都是字符串之类的anything = "description".

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

tad*_*man 15

虽然eval对于这类事物来说可能是一个有用的工具,而那些来自其他背景的人可能会像开罐器那样经常使用它,但实际上很随意地使用它.Eval意味着如果你不小心,任何事情都会发生.

更安全的方法是这样的:

on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)
Run Code Online (Sandbox Code Playgroud)

Object#send将调用您想要的任何方法.您可以发送符号或字符串,并提供该方法不是私有的或受保护的,应该可行.


Int*_*tss 15

由于这是一个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"
Run Code Online (Sandbox Code Playgroud)