Ruby on rails 获取Ruby变量的引用对象
我正在做一个任务,在这个任务中我得到了一组类(更准确地说是ActiveRecord类),我想得到它们的名称。我通过迭代这个集合并对集合的元素应用像Ruby on rails 获取Ruby变量的引用对象,ruby-on-rails,arrays,ruby,class,activerecord,Ruby On Rails,Arrays,Ruby,Class,Activerecord,我正在做一个任务,在这个任务中我得到了一组类(更准确地说是ActiveRecord类),我想得到它们的名称。我通过迭代这个集合并对集合的元素应用像#name这样的方法来实现这一点。 大概是这样的: array_of_classes.map {|class| class.name} > defined? UnInitializedClass nil > defined? InitializedClass "constant" 问题是该数组中的某些元素没有初始化,因此当我调用#nam
#name
这样的方法来实现这一点。
大概是这样的:
array_of_classes.map {|class| class.name}
> defined? UnInitializedClass
nil
> defined? InitializedClass
"constant"
问题是该数组中的某些元素没有初始化,因此当我调用#name
时,我得到:
NameError: uninitialized constant ClassName
要确定变量或常量是否已初始化,我可以使用defined?
关键字如下:
array_of_classes.map {|class| class.name}
> defined? UnInitializedClass
nil
> defined? InitializedClass
"constant"
问题是,当我们有一个包含已初始化和未初始化元素的数组,并且我们迭代该数组以获取它们的元素时,事情会变得更加复杂。defined?
关键字将应用于迭代器本身,而不是这些变量指向的类(或常量或变量)
> [UnInitializedClass, InitializedClass ].map {|x| defined? x}
["local-variable", "local-variable"]
是否有方法在变量x
保持不变的常量上应用定义的?
关键字
如果没有,你知道我如何找到Ruby数组中未初始化的元素吗
另一个想法可能是使用方括号方法[]
访问每个元素,但是已定义?
仍然没有应用于引用的常量
> defined? array[0]
"method"
> defined? array[1]
"method"
我不知道你怎么能有一个常量数组,其中一些没有定义。。。但是,您可以使用rescue块过滤掉有效常量
array_of_classes =
array_of_classes.each_with_object([]) { |klass, acc|
begin
klass
rescue NameError
# Do nothing
else
acc << klass
end
}
类的数组\u=
_类的数组_。每个_带有_对象([]){klass,acc|
开始
克拉斯
营救名称错误
#无所事事
其他的
acc或pdobb代码的较短版本:
array_of_classes.map {|klass| klass.name rescue nil}.compact
这个问题唯一有意义的方法是数组不包含常量和未初始化常量(后者会立即引发语法错误),而是包含已初始化未初始化类名称的字符串。在这种情况下,您可以执行以下操作:
class A
end
B = 'cat'
['A','B','C'].select do |s|
Object.const_defined?(s) ? Object.const_get(s).is_a?(Class) : false
end
#=> ["A"]
请注意,这涉及到一般的类,而不仅仅是特定的类。如何定义数组不爆炸?如果我尝试[Asdf]
在我开始尝试迭代之前,我立即得到了名称错误:未初始化常量Asdf
。我不是自己创建的。它是在我调用模型上的#reflect_on_all_association
时创建的。急切地加载类应该可以解决所有问题(模型类将全部加载)问题是导致问题的类已从项目中删除。问题是导致问题的类已从项目中删除,但出于某种原因,#reflect_on_all_associations
方法仍在返回它。这很有效!也许这不是最优雅的解决方案,但对我来说很有效。我们可以看一个例子吗?我想没有,因为你的开场白中给出了原因。如果数组是[A,B]
,并且B
尚未定义,你将立即得到一个语法错误(即,未被解救)此外,如果A
和B
都已定义,但A#=>“cat”
?错误代码的较短版本并不是一种改进。Cary,OP在对pdobb答案的评论中提到了“有效!”。