【问题标题】:Get Ruby class constant dynamically by name按名称动态获取 Ruby 类常量
【发布时间】:2013-09-16 03:20:17
【问题描述】:

我有一个类 API,它从第三方 API 中提取对象并将它们构建到属于 APIObject 类型的子类的对象中。 APIObject 子类与我从中提取的 API 中的对象名称匹配:

User < APIObject
Account < APIObject

我想在 APIObject 中定义一个类方法,允许我使用标准 Rails 访问器拉取对象:

user = User.find id

我想要将这个调用转换成这样的 API 调用的方法:

API::User::findById id

我想使用 self.class.name 访问 APIObject 子类 (User) 的名称并使用它来调用常量 (API::User),但我知道 API::self.class.name 将不起作用。我可以为每个子类一遍又一遍地重写这个方法,但似乎不这样做应该是可能的。有什么建议吗?

【问题讨论】:

  • 你试过什么?到目前为止,您所做的只是给我们一个要求列表。这不是这个网站的目的。我们帮助您编写您尝试编写的代码,我们不会为您编写代码。

标签: ruby oop


【解决方案1】:

我想你正在寻找const_get。可能是这样的:

def self.find(id)
  API.const_get(self.name).find_by_id(id)
end

(注意你只需要self.name,因为它已经在类的上下文中,而self.class.name 将只是Class)。

【讨论】:

  • 但如果我从 APIObject 中定义该方法以由子类继承,我将需要 self.class.name。是的?抱歉……对 Rails 还是有点陌生​​。
  • @kid_drew 没有。如果你想像User.find 那样称呼它,那么它是User 上的一个方法,所以self 已经是你感兴趣的类了(即@987654330 @)。如果你想在User 的实例上调用它(例如a_user.find),你需要self.class
  • @kid_drew 请注意,在 Ruby 中,当您从类继承时,类方法会被继承,并且可用于子类本身,实例方法可用于子类的实例。
  • const_get 太棒了@matt
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2011-02-20
  • 2011-03-31
  • 2013-02-22
  • 2013-11-29
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多