作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我才学习 Ruby 的深层部分才几个月,如果这是一个有点愚蠢的问题,我深表歉意。我正在尝试递归迭代可能 包含嵌套数组的数组,因此我需要检查当前元素的类型。我有以下代码作为小测试:
arr = [ 1..2, [3..4, [5..6]], [7..8, [9..10]] ]
arr.each do |node|
p node.class
p node.instance_of? Array
end
当我运行它时,我得到以下输出:
Range
false
Array
false
Array
false
鉴于我有一个包含范围和两个嵌套数组的数组,我希望最后两个返回 True。
更奇怪的是,如果我写以下内容:
node.class.name == "Array"
它应该返回 True。
这里发生了什么?
Ruby 版本:MRI 1.9.3-p194
注意:我最终意识到这是由于我使用模块命名我的代码以避免代码冲突的方式而发生的,就像这样,但也以一种顽皮的方式验证对象身份:
module MyProg
class MyClass
attr_reader :my_array
def initialize(size)
@my_array = Array.new(size)
end
end
end
MyProg::MyClass.new
这样做会隔离您的代码,但会导致所有 类查找从您的命名空间下开始解析。这意味着在上面的示例中,my_array.class
实际上会解析为 MyProg::Array
而不是全局 Array 类。
如果你的命名空间是这样的并且你仍然想使用这个方法,你可以通过在类之前使用双冒号全局标识符来强制 Ruby 从全局命名空间开始查找来补救它:
arr.is_a? ::Array
arr.is_a? ::String
但是鉴于 Ruby 的 Duck Typing 能力(以及为了以后更好的代码维护),您真的应该按照下面 Peter 的建议测试对象的行为。因此,我将他的回答标记为正确,以表彰他为学习者提供的出色帮助!
最佳答案
我写了另一个答案,但一个主要问题是 - 你为什么要这样做?为什么不直接在数组上调用 flatten
以便只获取条目?或者,改为检查对象的行为。您可能需要更详细地说明您的需求。
关于Ruby 的 'is_a?' 为内置类型返回 false,这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320164/
我是一名优秀的程序员,十分优秀!