2014-01-29 2 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 

해시 I가 a을 변경하더라도 동일한 결과 ([1,2,3] 배열)을 나타낸다. 변수 나 용기 (위의 예에서 해시)를 지정하지 않은 -

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

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

어떻게 일반적인 경우에 그것을 할 : a 변경 때이 예로서
, 나는 해시는 다른 결과를 보여주고 싶어?

#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; 
} 

생산됩니다 : 당신이 참조 사용할 수 있습니다 ++은 C의 예를 들어

,

a = 10 

new var = 42 

new a = 42 

은 루비에서 이런 일이 있습니까?

+0

http://stackoverflow.com/questions/8345755/ruby에서 객체 할당 – steenslag

+0

@steenslag 내게이 문제가 어떻게 관련되어/도움이 되었습니까? –

답변

3

루비는 참조를 가지고 있지만 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에 할당하면 링크가 끊어집니다.

= 할당 연산자 그냥 변수 이름 타 예를에 assing 때문에 당신은 단순히 #replace 방법과 Array의 인스턴스의 봉쇄를 교체
+0

'replace' 문제는 그것이 모든 클래스에있는 것이 아니라는 것입니다. 'String','Array','Hash' 만 체크 했으므로이 메소드를 포함합니다. +1은 루비 클래스의 일부에서 작동하기 때문입니다. 추신. 그래서 당신은 더 빨랐다 고 말했습니다 (몇 분). –

+0

나는 처음이었다. 그러나 @ Малъ는 답을 업데이트하기 전에 몇 초 만에 코드를 대체했습니다. :) –

+0

@ DarekNędza : 어쨌든, 저급 (C ext)에 이르기는하지만 무엇을 할 수 있는지 모르겠습니다. –

4

:

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 =) –

관련 문제