2016-04-11 36 views
0

Tamam, Ruby'nin argümanlarını bir işleve nasıl geçirdiği konusunda kafam karıştı.Dizeyi yakut işlevine geçirme

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 

varış değerini değiştirmemelidir Bu yöntemin çağrılması: Ben yakut değeri geçiyor belgelerde okumak, ama argümanlarının İşte tarafından ileten gibi benim durumumda görünüyor ettik problem Çünkü ruby ​​değerden geçer. Ama benim durumumda, , özgün diziyi değiştiriyor. Niye ya? Kodu:

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

Başvuru bir değerdir. Aynı dizide çalıştığınız diziyi kopyalamıyorsanız. –

+2

Olası kopyası [Yakut geçişi referansa mı yoksa değere mi göre mi?] (Http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value) – anquegi

+0

Yinelenmesi gereken bir nesne veya yeni bir yapı inşa etmek, e. g. } def buble_sort (* arr) ' –

cevap

2

anlamak için, bir değişken ve ne bu değişken açılımı arasında bir ayrım yapmak gerekir. Aşağıdaki örnek, göz önünde bulundurun: yakut, aynı zamanda yeni bir konuma arayan alanına göre yöntem maruz değişken olur alınan bir bağımsız değişken ile, bir yöntem içinde bu sayede, referans ile bu bağımsız değişkenler geçmiş ise

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] 

Artık ruby, argümanları değere göre geçirir, ancak aldığınız değer, çağrılan iletinin size aktardığı bellekte aynı konuma yapılan bir başvurudır. Başka bir deyişle, bir klon, bir çift, ama aynı nesne almazsınız.

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] 

Eğer yöntem bağımsız değişkenler üzerinde hiçbir yan etkiye sahip olmak istiyorsanız bunları kopyalayabilirsiniz.