Ruby数组包含类型吗?

3

我需要一个函数来检查一个数组是否包含其他数组,或者更普遍的说,是否包含某个类。我的朴素方法是:

found=false
[1,"a",[],:asdf].each { |x| found=(x.is_a? Array) ? true : found }
puts found

有没有优化的方法?
4个回答

6
在新版本的Ruby(2.5+)中,您不需要传递一个块给any?。该链接指向最新的文档,其中有一个类似的示例检查整数。
因此,您可以直接使用:
[1, "a", [], :asdf].any?(Array)
# => true

[1, "a", :asdf].any?(Array)
# => false

如果您的Ruby版本允许,那么这似乎是最简单的语法和最明智的方法 :)


4
您可以尝试使用“#any?”方法(#any?)。
例如:
[1,"a",[],:asdf].any? { |el| el.is_a? Array }
#=> true

2
几乎总是当你发现自己使用each时,你会发现缺少一些更高级的抽象。
在这种情况下,这个抽象是方法Array#any?,如果数组中的任何元素满足谓词,它将返回true
[1, "a", [], :asdf].any?(Array)

1
你的编辑使得你的回答与@SRack早先的回答相同。 - Cary Swoveland
@CarySwoveland,这是他多年来建立声誉的方式之一。 - Nakilon
@Nakilon,我们很幸运有Mittag先生。我从他那里学到了很多。 - Cary Swoveland

1
这种方法即使找到了一个数组,也会遍历所有元素。 在您的测试用例中,它将遍历:asdf,您不必检查此内容。
我认为如果您发现了特定类型(例如我们的示例中的数组),则需要从循环中退出。
found = false
[1,"a",[],:asdf].each do |x|
    if x.is_a? Array
     found = true
     break
    end
end

puts found

您可以使用any代替each
found = [1,"a",[],:asdf].any? { |x| x.is_a? Array }
puts found # true

那个编辑使这成为了@AlexGolubenko答案的复制 :( - SRack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接