3

修正済み: EDIT EDIT を参照

n-ary ツリーに対して独自の再帰的 each を作成するのに問題があります。@elementはノードの値であり、@children接続されたすべての下位ノードの配列です。これは私の方法です:

def each
  yield(@element)

  @children.each { |x|
    x.each { |i| yield i}
  }
  self
end

問題は、下の要素を繰り返すことです。たとえば、これを使用して値 o と 1 つの子 c を持つノードを出力すると、「oc」ではなく「occ」が出力されます。何が起こっているのか本当にわからないので、試みた修正はすべて効果がありませんでした. 何か案は?

編集:これは、ノード値を生成するだけでなく、何らかの形でノード値でそれぞれを呼び出しているためである可能性があると思います。そのため、単一文字の文字列の場合、その文字を生成し、.each呼び出しで再度生成します。

EDIT EDIT: 皆さん、読んでくれてありがとう。問題はこのメソッドではなく、同じクラスの別の to_s にありました。to_s は正しく出力されますが、親ノードが文字列の場合は値が変更されます。私がテストするときはいつでも、いつも to_s を最初に使用していましたが、それを認識していませんでした。これにつきましては申し訳ございません。(私は初心者なので、私自身の質問に答えることはできません)。

4

1 に答える 1

3

あなたの回答から判断すると、あなたが望んでいるのは次のようなものだと私には思えます:

class Tree
  def initialize element, children = []
    @element, @children = element, children
  end
  def each &pr
    pr.call(@element)
    @children.each{|x| x.each(&pr)}
    self
  end
end

a = Tree.new('self')
b = Tree.new('parent', [a])
c = Tree.new('grandparent', [b])

c.each{|x| puts x}
# => grandparent
# => parent
# => self

b.each{|x| puts x}
# => parent
# => self

&pr1 つの通知は、proc オブジェクトを再帰的に渡したいように見えるため、yield.

于 2011-05-02T02:13:18.650 に答える