2011-12-23 25 views
1

在Rails中,變量似乎是鏈接的,即如果你使a = b,如果你改變了b,你也改變了。此外,如果你改變了,你也改變b。鏈接/配對的變量,以及如何控制或打破這些鏈接

我來自一個原始的程序設計背景(FORTRAN和C:語言航空航天仍然受限於),所以這種變量鏈接對我來說是新的。此外,我給了我一些麻煩,所以我正在尋找一種方法來控制它。

我想能夠定義一個變量作爲一個閃爍的常量值(或值的數組),直到我重新定義一個具體的,讓它保持不變。更具體地講,如果我這樣做:

A = B

然後,我要重新定義

b = Q

我會想保留原來的B值(稱之爲B」 )而新的b的值爲q。

A = B '

b = Q

A = B'!= B = Q

看從導軌控制檯下面的腳本來進一步說明上述的可變聯。你可以知道這兩個變量是相互依賴的:你不能改變另一個。任何控制這種現象的幫助,或者僅僅是參考我可以更多地瞭解它的地方,都會更加讚賞。

system :004 > b = [] 
=> [] 
system :005 > b = [123,456] 
=> [123, 456] 
system :006 > a = b 
=> [123, 456] 
system :007 > a 
=> [123, 456] 
system :008 > b 
=> [123, 456] 
system :009 > b[0] 
=> 123 
system :010 > b[0]=789 
=> 789 
system :011 > a 
=> [789, 456] 
system :012 > b 
=> [789, 456] 
system :013 > a[0] = 0 
=> 0 
system :014 > a 
=> [0, 456] 
system :015 > b 
=> [0, 456] 
system :016 > 
+0

這似乎只與哈希發生..也就是說,如果A = [ 0,1]; b = a然後b => [0,1] ...然後如果你改變一個[0],你也會改變b [0]。但如果你使用變量如a =「asdf」; b = a,a =「fjf」,那麼b將持續爲「asdf」。 – jay 2011-12-23 05:17:41

+0

有趣的是,有沒有辦法讓哈希不斷呢? – 2011-12-23 06:18:18

回答

0

您遇到的主要問題是,一旦你已經創建了一個對象(說),其他實例變量通常會創建指向同一個對象,而不是創建一個新的。

在這個答案:Object assignment and pointers有人會說「分配永遠不會在紅寶石中創建副本,但方法通常會返回新對象而不是修改現有對象。」

簡短的回答:以確保您創建一個新的對象(即不是一個新的指針指向同一個),這樣做:

b = a.dup 
+0

您的解決方案有效。特別是對於我上面的問題。不幸的是,我仍然有問題。上面的問題是我的問題的簡化。我留下的問題是指向數據庫的鏈接或指針,無論是否創建.dup,無論何時調用變量上的「.find」,它都會返回到數據庫中以查找它,而不是局部變量。我會環顧四周,看看是否有任何方法可以在本地變量中「.find」,而不需要鏈接回根數據庫,但如果你知道任何一個,我會更感激你的想法。 – 2011-12-23 09:38:27