2011-02-05 3 views
0

초보자로서 내가 놓친 Ruby에 대한 것이지만, 내 인생에서 나는이 결과를 이해하지 못합니다. 그래서 저는이 간단한 함수를 가지고 있습니다 :Ruby에서 한 문자열을 다른 문자열로 설정할 때 미친 동작이 발생했습니다.

def crazyfunc(s) 
    s.gsub!('a', 'b') 
    #return has not purpose here 
end 

이제이 간단한 몇 세트가 있습니다.

s1 = 'abc' 
s2 = s1 
s2 = crazyfunc(str2) 

puts s1 

=> bbc 

왜 s1이 crazyfunc의 영향을 받습니까? 그래서 이것을 대신해서 :

def crazyfunc(s) 
    return s.gsub('a', 'b') 
end 

str1은 바뀌지 않습니다. 하지만 여전히 str1이 변경되는 이유에 대한 논리는 없습니다.

+0

나는'return strin'을'return string'으로 편집했습니다. – s84

+0

대기열에서 'string'열의 속성을 호출하지 마십시오. – s84

+0

ok, 그래서 모든 'string'변수를 변경했습니다. 문자열은 근본적으로 예약어입니다. 이것을 변수로 사용하지 마십시오. – s84

답변

5

Ruby에서 문자열을 할당해도 암시 적으로 문자열이 복사되지 않습니다. 다른 참조를 지정하는 것입니다. 문자열을 복사하려면 복제를 사용하십시오.

는 개체 ID를 확인할 수 있습니다 입증하려면

ree-1.8.7-2010.02 > a = "foo" 
=> "foo" 
ree-1.8.7-2010.02 > b = a 
=> "foo" 
ree-1.8.7-2010.02 > a.object_id 
=> 81728090 
ree-1.8.7-2010.02 > b.object_id 
=> 81728090 

a 이후와 b가 같은 개체 ID를 가지고, 당신은 그들이 동일한 개체 거 알아. ba의 복사본으로 수정하려면 gsub!이 아닌 gsub과 같은 새 문자열을 반환하는 메서드를 사용하거나 b = a.clone을 사용하고 b을 사용할 수 있습니다.

ree-1.8.7-2010.02 > a = "foo" 
=> "foo" 
ree-1.8.7-2010.02 > b = a.clone 
=> "foo" 
ree-1.8.7-2010.02 > a.object_id 
=> 81703030 
ree-1.8.7-2010.02 > b.object_id 
=> 81696040 
ree-1.8.7-2010.02 > b.gsub! "f", "e" 
=> "eoo" 
ree-1.8.7-2010.02 > a 
=> "foo" 
ree-1.8.7-2010.02 > b 
=> "eoo" 

또는 더 간단 : 당신은 루비의 모든 객체 즉, 변수는 단지 객체 참조하고 있다는 사실에 실행

ree-1.8.7-2010.02 > a = "foo" 
=> "foo" 
ree-1.8.7-2010.02 > b = a.gsub("f", "e") 
=> "eoo" 
ree-1.8.7-2010.02 > puts a, b 
foo 
eoo 
+0

쏴, 당연하지. 아침 2시에 분명히 생각하지 않아. –

0

.

str1 =을 str2에 할당하면 실제로는 같은 개체를 가리키고 있습니다. 그런 다음 str2가 가리키는 객체를 변경하면 str1이 가리키는 객체도 변경됩니다.

원본 crazyfunc에서는 문자열을 수정하고 수정 된 문자열을 반환 한 다음 str2와 str1이 가리키는 개체의 값을 변경합니다.이 개체는 동일한 개체를 가리키고 있기 때문입니다.

0
s1 = 'abc' 
s2 = s1 
s2 = crazyfunc(str2) 

#master

B는

C = B

A가있다 = 및 B는 A와 C는 B를 변경하는 경우 그것은 영향을 미치지 않습니다 B. 동일 동일 그러나 C에 영향을 미친다. 나열한 변수는 포인터 일뿐입니다.

여기에는 오직 하나의 마스터 변수 만 있으므로 두 개를 선언해야합니다.

관련 문제