【发布时间】:2016-01-08 10:10:10
【问题描述】:
我正在做一个任务,我得到一组类(更准确地说是 ActiveRecord 类),我想得到它们的名字。我通过迭代这个集合并将#name 之类的方法应用于集合的元素来做到这一点。
像这样的:
array_of_classes.map {|class| class.name}
问题是这个数组中的一些元素没有初始化,所以当我对它们调用#name 时,我得到:
NameError: uninitialized constant ClassName
要了解变量或常量是否已被初始化,我可以使用 defined?keyword,如下所示:
> defined? UnInitializedClass
nil
> defined? InitializedClass
"constant"
问题在于,当我们有一个 已初始化和未初始化元素的数组并且我们遍历数组以获取它们的元素时,事情会变得更加复杂。 defined? 关键字将应用于迭代器本身,而不是应用于这些变量指向的类(或常量或变量)。
> [UnInitializedClass, InitializedClass ].map {|x| defined? x}
["local-variable", "local-variable"]
有没有办法将defined? 关键字应用于constant 变量x 持有?
如果没有,您知道如何找出 Ruby 数组中未初始化的元素吗?
另一个想法可能是使用方括号方法[] 访问每个元素,但defined? 仍然没有应用于引用的常量
> defined? array[0]
"method"
> defined? array[1]
"method"
【问题讨论】:
-
定义数组怎么不炸?如果我尝试
[Asdf],我会在开始尝试迭代之前立即得到NameError: uninitialized constant Asdf。 -
我不是自己创建的。它是我在模型上调用
#reflect_on_all_associations时创建的。 -
急切加载类应该可以解决所有这些问题(模型类将全部加载)
-
问题是导致问题的类已经从项目中移除了。
-
问题是导致问题的类已从项目中删除,但由于某种原因
#reflect_on_all_associations方法仍在返回它。
标签: ruby-on-rails arrays ruby class activerecord