2011-05-19 22 views
1

私はルビーの初心者です。ルビの変数の問題

私の問題は、値と参照による引数渡しです。

私は、配列の内容は、親ノードであるが、この方法

def show_as_tree(parents) 
    array = [] 
    iterate_categories(parents, array) 
end 

def iterate_categories(parents, array) 
    parents.each do |p| 
    #return p.description or "-#{p.description} if the node is root or not 
    p.description = category_name(p) 

    #add to array 
    array << p 

    #call iterate categories with children of parent node and same array 
    iterate_categories(p.children, array) 
    end 
end 

をコーディングしています。

参考のためにルビーの仕組みを理解する必要がありますが、どうすれば問題を解決できますか?

+0

どのオブジェクトでもobject_idメソッドを使用して質問に対する回答を得ることができます。 – taro

答えて

1

私はRubyがあなたの配列のコピーを作成していると確信しています。したがって、あなたがしなければならないことは、持っていることです。

array << iterate_categories(p.children, new_array) 

そして関数の最後に配列を返します。

ちょうど簡単な例をした:助け

>> a = Test.new 
>> a.iterate_categories_test 
Bob 
Joe 
Ann 
John 
=> nil 

願わくば:次に

class Person 
    attr_accessor :name, :children 
end 

class Test 

    def iterate_categories(parents,array) 
    parents.each do |p| 
     array << p.name 
     if !p.children.nil? 
     iterate_categories(p.children,array) 
     end 
    end 
    end 

    def iterate_categories_test 
    p1 = Person.new 
    p1.name = "Bob" 

    p2 = Person.new 
    p2.name = "Joe" 

    p3 = Person.new 
    p3.name = "Ann" 

    p4 = Person.new 
    p4.name = "John" 

    p1.children = [p2,p3] 
    p3.children = [p4] 

    array = [] 
    iterate_categories([p1],array) 
    puts array 
    end 
end 

(ウェイン・コンラッドの回答に基づいてコードを更新...それは正しいです)。

+0

実際には、rubyは引数を参照渡ししますが、コピーオンライトも行います。http://www.ruby-forum.com/topic/41160 – Kris

+0

@Kris、私は間違っていると思います。 Rubyではコピーオンライトは行いません。変数は(概念的には、少なくとも)参照です。メソッドを呼び出すと、引数リストで渡した値への参照が引数に割り当てられます。また、変更可能なオブジェクトは、参照を介して送信されたメッセージ(メソッド呼び出し)によって状態が変更される可能性があります。それはかなりです。 –

+0

この解決法は、 'array'をコピーしていたわけではありませんでしたが、関数から' array'を正しく返すためです。 –

0

私はコードを取得していないので、書式設定は間違っているようですが、私は助けようとします。

ルビに引数を渡すと、メソッドには参照ではなくコピーが渡されているようです。幸いにも、あなたはそれについて心配する必要はありません。ルビは1回の呼び出しで複数のものを返すことができるからです。あなたは簡単に問題

私は私はあなたの質問に答えを期待せずに複数の値を返すことができ

ruby-1.9.2-p180 :005 > def stuff(a, b) 
ruby-1.9.2-p180 :006?> c = a + b 
ruby-1.9.2-p180 :007?> [c, a] 
ruby-1.9.2-p180 :008?> end 
=> nil 
ruby-1.9.2-p180 :009 > a, b = stuff(1, 2) 
=> [3, 1] 
ruby-1.9.2-p180 :010 > a 
=> 3 
ruby-1.9.2-p180 :011 > b 
=> 1 

その方法:

は例えば、IRBに私はこのような何かを実行しました。

+0

Rubyは引数をコピーしますが、コピーするのは* references *です。 –

1

あなたのshow_as_treeメソッドは配列を返さなければなりません。最後の行としてarrayなし

def show_as_tree(parents) 
    array = [] 
    iterate_categories(parents, array) 
    array 
end 

は、show_as_treeの戻り値はparentsであることを起こるiterate_categoriesの戻り値、です。だからこそ、arrayにはparentsが追加されたようです。それは錯覚です。parentsが返されました。arrayではありません。

Rubyは引数のコピーを作成しません。 は参照値を値で渡します。それは、あなたの機能を通して同じ配列が実行されていることを意味します。

+0

お役立ち情報毎日何か新しいことを学ぶ。ありがとう。 – RyanJM