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)
| 归档时间: |
|
| 查看次数: |
19610 次 |
| 最近记录: |