2014-01-29 40 views
0

如何在Ruby中執行此操作?
例如,在紅寶石:類似於變量的引用

a = [1,2,3] 
h= {vara: a} 
p h[:vara] # [1,2,3] 

a = [42,43,44] 
p h[:vara] # [1,2,3] - still the same 

哈希示出雖然我已經改變a相同的結果(陣列[1,2,3])。
對於這個例子,我想在a改變哈希顯示了不同的結果:

a = [1,2,3] 
h= {vara: a} 
p h[:vara] # [1,2,3] 

a = [42,43,44] 
p h[:vara] # [42,43,44] - changed! 

如何做,在一般的情況下 - 沒有指定變量,也不容器(在上面的例子中的散列)是什麼嗎?

例如,++可以使用參考的C:

#include <iostream> 
#include <stdlib> 
int main(void) 
{ 
    int a = 10; 
    int &var = a; 
    std::cout<< "\na = "<< a <<"\n"; 
    a = 42; 
    std::cout<< "\nnew var = " << var << "\n"; // 
    std::cout<< "\nnew a = " << a << "\n"; 

    system("pause"); 
    return 0; 
} 

會產生:

a = 10 

new var = 42 

new a = 42 

有沒有這樣的事情在Ruby?

+0

http://stackoverflow.com/questions/8345755/object-assignment-in-ruby – steenslag

+0

@steenslag這與我的問題有何聯繫? –

回答

3

Ruby有引用,但它們更像C++指針(帶透明解引用)。

沒有相當於C/C++的引用。不過,你總是可以寫一個C擴展。

而不是完全取代「a」參考本身,您可以替換它指向的內容。

a = [1,2,3] 
h= {vara: a} 
p h[:vara] 

a.replace([40, 41, 42]) # <== note here 
p h[:vara] 
# >> [1, 2, 3] 
# >> [40, 41, 42] 

在這種情況下,既h[:para]a仍然指向相同的陣列。但是,當您分配給a時,鏈接會中斷。

+0

'replace'的問題在於它不是在每個類中。因爲我只檢查了'String','Array','Hash'包含這個方法。 +1,因爲它適用於部分Ruby類。 PS。所以說你比較快(幾分鐘)。 –

+0

我是第一個,是的。但@Малъ發佈了代碼,並在更新我的答案之前更換了幾秒鐘。 :) –

+0

@DarekNędza:無論如何,除了進入低級(C ext)之外,我不知道這裏可以做些什麼。 –

4

您只需更換Array#replace方法的實例的遏制,因爲=賦值運算符只是assing到一個變量名的其他實例

a = [1,2,3] 
h = {vara: a} 
h[:vara] 
# => [1,2,3] 

a.replace [42,43,44] 
h[:vara] 
# => [42, 43, 44] 
+0

啊,該死的,我即將發佈我的副本。 :) –

+0

順便說一句,它是'Array#replace',而不是'Hash#replace'。 –

+0

@SergioTulentsev jey =) –