私はオブジェクトを持っていますtree
。tree
というプロパティがありますtree.elements
。tree.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")
たが、うまくいきません。これについて最善の方法は何ですか?