2008-10-02 5 views
25

루비에서는 value-type 의미 (예 : Fixnum)가있는 매개 변수를 참조로 전달할 수 있습니까? C#의 'ref'과 비슷한 것을 찾고 있습니다.'참조로 매개 변수 전달'이 루비에 있습니까?

예 : Btw는

def func(x) 
    x += 1 
end 

a = 5 
func(a) #this should be something like func(ref a) 
puts a #should read '6' 

. 나는 단지 다음과 같이 사용할 수 있다는 것을 알고있다 :

a = func(a) 

답변

30

당신은 명시 적으로 현재의 바인딩을 전달하여이 작업을 수행 할 수 있습니다 : 루비에서 참조로 매개 변수를 전달할 수

def func(x, bdg) 
    eval "#{x} += 1", bdg 
end 

a = 5 
func(:a, binding) 
puts a # => 6 
+3

이 스레드는 안전한가요? – Dex

18

루비는 "pass by reference"를 전혀 지원하지 않는다. 모든 것은 객체이며 객체에 대한 참조는 항상 값으로 전달됩니다. 사실, 당신의 예제에서는 값의 Fixnum Object에 대한 참조 복사본을 전달합니다.

코드에있는 문제는 x += 1이 전달 된 Fixnum 개체를 수정하지 않고 완전히 새롭고 독립적 인 개체를 만드는 것입니다.

자바 프로그래머는 Fixnum 개체 불변이라고 생각합니다.

+3

변수와 매개 변수에 객체에 대한 참조 만 포함될 수있는 경우 Ruby가 ref로 전달하지 않는 것은 없습니다. 참조가 값에 의해 전달된다고 말하는 것은 객체가 참조로 전달되었다는 것과 같습니다. –

+2

@Damien : 아니야. 참조에 의한 전달 (예 : C++, C#, PHP, Perl)을 사용하면 외부 범위에서 변수에 할당 한 것처럼 * 변수에 * 할당 할 수 있습니다. 당신이 여기에서하려고하는 것은 참조에 의한 참된 통과가 가능할 것입니다; 그러나 참조 값을 전달하는 것은 아닙니다. – newacct

+6

네 말이 맞아, 나는 크리스토프의 대답과 내 의견을 다시 읽고있어. 내 2009 년 자기와 동의하지 않는다. 음 ... –

10

. 예를 들어, 새 값을 반환하여 변수 a에 할당하거나 값을 포함하는 새 클래스를 만들고이 클래스의 인스턴스를 전달해야합니다. 예 :

class Container 
attr_accessor :value 
def initialize value 
    @value = value 
end 
end 

def func(x) 
    x.value += 1 
end 

a = Container.new(5) 
func(a) 
puts a.value 
6

당신은 트릭 다음 시도 할 수 있습니다 :

def func(x) 
    x[0] += 1 
end 

a = [5] 
func(a) #this should be something like func(ref a) 
puts a[0] #should read '6' 
+0

그래, 그게 작동 –

+0

기술적으로 이것은 또한 쓰기에 대한 변수 (및 목록의 참조)를 대체합니다. – itarato

관련 문제