2016-04-11 27 views
0

さて、私はルビが引数を関数に渡す方法について混乱しました。配列をルビ関数に渡す

def buble_sort(arr) 
unordered = true 
while unordered 
    unordered = false 
    for i in (1..arr.size-1) 
     if(arr[i-1] > arr[i]) 
      arr[i-1], arr[i] = arr[i], arr[i-1] 
      unordered = true; 
     end 
    end 
end 
arr 
end 

ARR値を変更しないでください、このメソッドを呼び出す:私はルビーがを通過ドキュメントを読み込むが、それはreferanceここ 渡しているように私の場合には、それが見えてきた問題ですルビーはそれを価値によって受け渡すからです。しかし、私の場合、オリジナルの配列を変更しますか?どうして? コード:

p "#{arr} before sort" # => "[85, -4, 1, 2, 55, 23, 0] before sort" 
p buble_sort(arr) # => [-4, 0, 1, 2, 23, 55, 85] 
p "#{arr} after sort" # => "[-4, 0, 1, 2, 23, 55, 85] after sort" 
+6

参照は値です。あなたが同じ配列で操作している配列をコピーしない限り。 –

+2

[参照または値でRubyが渡されますか?](http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value) – anquegi

+0

オブジェクトを作成するか、新しいオブジェクトを作成する。 g。 'def buble_sort(* arr)' –

答えて

2

はあなたが変数と何、この変数の略間の区別をしなければならない、ということを理解すること。次の例を考えてみましょう:ルビーは、それはまた、新しい場所に、発信者の位置によって方法にさらさ変数になるだろう受け取った引数をメソッド内でそうすること、参照によって引数を渡した場合

items = [1, 2, 3] 
# the variable items points to an array we just instantiated 
items = [4, 5, 6] 
# items now points to a new array 

items = [1, 2, 3] 
def my_method array 
    array = [4, 5, 6] 
    return array 
end 
my_method(items) # --> [4, 5, 6] 
items # --> [1, 2, 3] 
# if ruby passed arguments by reference, items would now be [4, 5, 6] 

ルビは引数を値で渡しますが、受け取った値は、呼び出されたものと同じ場所への参照です。言い換えれば、クローン、dupは得られませんが、同じオブジェクトです。

items = [1, 2, 3] 
def my_method array 
    array << 4 
    return array 
end 
my_method(items) # --> [1, 2, 3, 4] 
items # --> [1, 2, 3, 4] 

引数に副作用がないようにするには、それらをクローンすることができます。