2012-05-01 34 views
0

當我嘗試從一個數組流行元素紅寶石流行陣列,它彈出。當我分配該陣列另一個變量彈出之前,然後,如果我彈出,彈出操作會影響二者的陣列。而不影響其它變量

例如:

ruby-1.9.2-p290 :339 > a= [1,2,3] 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :340 > b = a 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :341 > a 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :342 > b 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :343 > a.pop 
    => 3 
    ruby-1.9.2-p290 :344 > a 
    => [1, 2] 
    ruby-1.9.2-p290 :345 > b 
    => [1, 2] #WHY? 
    ruby-1.9.2-p290 :346 > x = [1,2,3] 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :347 > y = x 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :348 > z = x 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :349 > y 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :350 > z 
    => [1, 2, 3] 
    ruby-1.9.2-p290 :351 > y.pop 
    => 3 
    ruby-1.9.2-p290 :352 > y 
    => [1, 2] 
    ruby-1.9.2-p290 :353 > z 
    => [1, 2] # WHY? 
    ruby-1.9.2-p290 :354 > x 
    => [1, 2] 
    ruby-1.9.2-p290 :355 > 

如果我使用的流行,所有的變量都受到影響。我想保留原始數組並彈出另一個。怎麼樣?

+0

你的編輯是一個不同的問題。請打開一個新問題。 – Mischa

+0

@Mischa:問了。感謝您的支持! – beck03076

回答

6

如果您分配一個數組來一個新的變量,它是不可複製的,但你只設置爲原始數組的引用。如果你想保持原來的數組,你必須使用dup克隆它:

ruby-1.9.2-p180 :001 > a = [1,2,3] 
=> [1, 2, 3] 
ruby-1.9.2-p180 :002 > b = a.dup 
=> [1, 2, 3] 
ruby-1.9.2-p180 :003 > b.pop 
=> 3 
ruby-1.9.2-p180 :004 > a 
=> [1, 2, 3] 
ruby-1.9.2-p180 :005 > b 
=> [1, 2] 
+0

傳奇............. !!! – beck03076

0

紅寶石十分面向對象的。除了極少數例外,Ruby幾乎總是通過引用傳遞變量,而不是值。這是一個非常重要的概念。 Check this out。它不是紅寶石,但它可能有助於揭開神祕面紗。希望有所幫助!

+0

-1。這個錯誤。首先,Ruby是通過價值傳遞的。其次,沒有例外,Ruby總是*通過值傳遞。如果你想知道Ruby(或任何其他語言)是通過引用還是按值傳遞,只需嘗試一下:'def foo(bar)bar ='reference'end; baz ='價值'; FOO(巴茲);放入「Ruby是傳遞 - #{baz}」'。 –

+1

閱讀,你已經對這個問題作出其他職位後,很明顯,你堅持這個詞的嚴格的計算機科學意義。在這種情況下,這只是平淡無奇。 OP正在詢問關於傳遞物體的問題。請考慮不那麼迂腐。 –

+0

我說的是Ruby,它甚至沒有*原語,只有對象。我在我的評論中提供了一個簡單的測試程序,如果你不相信我,你可以自己剪切並粘貼到IRB中。 –

3

在紅寶石賦值運算符是製作值的副本,只有當它處理POD(普通舊數據)對象,如數字,字符串。在其他情況下,它只是將引用複製到對象。

而且不要忘記,dup(和clone)方法使唯一對象的淺拷貝。這意味着如果你的數組裏有其他非POD對象,它們將不會被複制。

inner = [1,2,3] 
=> [1, 2, 3] 
outer = [inner, 7,8,9] 
=> [[1, 2, 3], 7, 8, 9] 

outer_dup = outer.dup 
inner.pop 
=> 3 

outer 
=> [[1, 2], 7, 8, 9] 
outer_dup 
=> [[1, 2], 7, 8, 9] 

您可以通過覆蓋clone方法來處理自己做深拷貝避免它。

+0

感謝您的幫助。 「dup」就是我一直在尋找的東西。看看問題編輯部分,瞭解爲什麼我想要它,謝謝! – beck03076

+0

@Flexoid,謝謝你擴展我的答案。 +1 – Mischa