Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 获取Ruby变量的引用对象_Ruby On Rails_Arrays_Ruby_Class_Activerecord - Fatal编程技术网

Ruby on rails 获取Ruby变量的引用对象

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

我正在做一个任务,在这个任务中我得到了一组类(更准确地说是ActiveRecord类),我想得到它们的名称。我通过迭代这个集合并对集合的元素应用像
#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答案的评论中提到了“有效!”。