Ruby中的嵌套数组和字符串

Ruby中的嵌套数组和字符串,ruby,Ruby,我试图找出嵌套数组,特别是多维类型的。我已经阅读了两篇关于它们的文章,当迭代检查字符串时,我被绊倒了 # Array - more_nested_array = [["hello", ["world", "new york"]], ["love", "ruby"]] # Iteration- more_nested_array.each do |element| element.each do |inner_element| if inner_element.is_a?(Array

我试图找出嵌套数组,特别是多维类型的。我已经阅读了两篇关于它们的文章,当迭代检查字符串时,我被绊倒了

# Array - 
more_nested_array = [["hello", ["world", "new york"]], ["love", "ruby"]]

# Iteration-
more_nested_array.each do |element|
 element.each do |inner_element|
    if inner_element.is_a?(Array)
      inner_element.each do |third_layer_element|
     end
   end
  end
end
所以它使用if语句,因为假定在某些迭代中存在字符串。这个对字符串的引用让我很困惑,因为它看起来只是一堆数组。有人能解释一下吗

“hello”
是一个字符串,它与数组一起存储,例如
[“world”,“newyork”]
,这就是为什么代码会忽略字符串,因为字符串上没有定义
每个
方法。

nomethoder否则 需要进行检查,因为循环是针对给定的树(或者嵌套数组,如果愿意的话)硬编码的

删除支票:

more_nested_array = [["hello", ["world", "new york"]], ["love", "ruby"]]

# Iteration-
more_nested_array.each do |element|
  element.each do |inner_element|
    inner_element.each do |third_layer_element|
      puts third_layer_element
    end
  end
end
产出:

undefined method `each' for "hello":String (NoMethodError)
因为不是每个
内部元素都是数组或响应
每个

递归版本 对于这种结构,最好编写递归方法来解析树,而不是硬编码树深度和节点类

more_nested_array = [["hello", ["world", "new york"]], ["love", "ruby"]]

def parse_tree(node, current_depth = 0)
  if node.respond_to?(:each)
    node.each do |child|
      parse_tree(child, current_depth + 1)
    end
  else
    puts "Found #{node.inspect} at depth #{current_depth}"
  end
end

parse_tree(more_nested_array)
它输出:

Found "hello" at depth 2
Found "world" at depth 3
Found "new york" at depth 3
Found "love" at depth 2
Found "ruby" at depth 2

“字符串也是可写的”你确定吗?字符串是由字符组成的,不是吗?“代码忽略了字符串,因为字符串是可写的”-你能解释一下吗?@hspandher很抱歉,我完全误解了你的答案!你说“代码正在使用
if
,因为否则它也会迭代字符串”,我读到“代码不会因为
if
而跳过字符串,但因为它们是可写的”(这没有任何意义),我没有(否决票不是我的)。不幸的是,您的结论仍然是错误的,因为
String
不响应
每个
,因此如果没有
if
,您将得到
NoMethodError
。代码不会迭代字符。您也可以说“因为不是每个
内部元素
都响应
每个
”(通过
respond\u?
进行检查可能比类型检查更可取)好吧,我想数组的编写方式让我感到困惑。按照我的理解,最外侧的括号似乎是父数组。在中,有两个子数组,但在第一个子数组中有自己的子数组(或原始父数组的孙子数组)。i、 这不是一棵树,没有父子关系
更多嵌套数组
的第一个元素是数组,它包含两个元素:一个字符串
“hello”
和一个(其他)数组
[“world”,“new york”]
。可能您的印象是数组可能只包含一种“类型”的对象。Ruby中的情况并非如此。数组可以包含任何对象:
[1,nil,:foo,“bar”,{a:2}]
是一个有效的数组。@Stefan:OP的嵌套数组当然可以被看作是一棵叶子是字符串的树,但它不一定有助于理解结构。@Stefan,好的,这说明了一些问题。我现在看到了区别,这是有道理的。我知道数组可以容纳各种各样的对象,所以不确定我希望看到什么。我所做的是尝试用括号分开和计数,其中实际有多少数组。我将寻找更多的例子,以使它的锤在,谢谢!