1

我有一个对象,treetree有一个属性,tree.elementstree.elements是一个包含元素和可能的其他子树的数组,这些子树又将有自己的elements数组,依此类推。

如果树中的对象属于某个类,我需要一个能够替换树中对象的方法。问题是替换内联元素。

显然,以下方法不起作用:

[1,2,3].each { |n| n = 1 }
# => [1,2,3]

但是,这将:

a = [1,2,3]
a.each_with_index { |n, idx| a[idx] = 1 }
# => [1,1,1]

但是,我使用递归函数进行循环,并用内容替换占位符,如下所示:

def replace_placeholders(elements)
    elements.each do |e|
        if e.respond_to?(:elements) and e.elements.any?
            replace_placeholders(e.elements)
        elsif e.is_a? Placeholder
            e = "some new content" # << replace it here
        end
    end
end

跟踪指数真的很复杂。我试过e.replace("some new content")了,但这不起作用。解决这个问题的最佳方法是什么?

4

2 回答 2

3

我会创建一个新数组,而不是尝试就地更新。这些方面的东西应该起作用:

def replace_placeholders(elements)
  elements.map do |e|
    if e.respond_to?(:elements) and e.elements.any?
      e.elements = replace_placeholders(e.elements) # replace array
      e  # return e itself, so that map works correctly.
    elsif e.is_a? Placeholder
      "some new content"
    end
  end
end
于 2012-07-04T07:23:45.903 回答
1

使用数组#collect:

[1,2,3].collect { |n| 1 }
# => [1,1,1]

并使用此块参数做任何你想做的事情。

所以你的代码会是这样的:

elements.collect{ |n| if n.respond_to?(:elements) and n.elements.any?
        replace_placeholders(n.elements)
    elsif n.is_a? Placeholder
        "some new content" # << replace it here
    end
}
于 2012-07-04T07:23:36.730 回答