【问题标题】:How do I dynamically invoke or call a class in Rails?如何在 Rails 中动态调用或调用类?
【发布时间】:2012-07-14 11:24:10
【问题描述】:

假设我可以构造一个与现有类匹配的字符串,我该如何调用它?

例如,我有几个类:

  • 我的班级1
  • MyClass2
  • MyClass3

我想通过构造一个匹配它们名称的字符串来动态调用它们中的每一个。如果他们都有方法“方法”,我该怎么做?:

(1..3).each do |n|
  ("MyClass"+n).methods
end

【问题讨论】:

  • 你确定数组中的匿名类不适合吗?一旦你开始通过迭代使用命名空间,你就应该重新考虑你的代码。
  • 嗨,Tass,你能扩展一下“数组中的匿名类”吗?我相当肯定这不是解决我目前正在处理的问题的最佳方法,但我认为我应该知道如何做这样的事情。

标签: ruby-on-rails ruby class dynamic invoke


【解决方案1】:

constantize 符合要求。你可以阅读更多关于它的信息here。在你的情况下,它会是这样的:

(1..3).each do |n|
  "MyClass#{n}".constantize.methods
end

【讨论】:

  • 谢谢!跟进 zsquare 的回答,我得到了两个答案! klass = Object.const_get "MyClassName" -or- klass = "MyClassName".constantize 两者都返回你感兴趣的任何品牌的类。环顾四周时,我还发现 Inflector 类对于动态构建类很方便名字。 api.rubyonrails.org/classes/ActiveSupport/…
【解决方案2】:

你也可以——

(1..3).each {|n| eval "MyClass#{n}.methods"}

【讨论】:

  • eval 投反对票。你不应该使用像eval 这样的东西,除非你确定你必须这样做,并且确定没有其他方法可以做到这一点。然后,如果你确定你可能做错了什么。
  • 如果您需要在 ruby​​ 中执行此操作,即没有 rails,您会以什么其他方式调用它?
  • classname = 'Integer'; Kernel.const_get(classname).methods
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多