gpt4 book ai didi

Ruby 的 'is_a?' 为内置类型返回 false,这是怎么回事?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:22 27 4
gpt4 key购买 nike

我才学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com