2017-09-16 9 views
0
위한
a = %W(a b c).each {|a| a << "\n"} 
a.each {|a| print a} 

디스플레이의 차이 :

B
C루비 "+ ="및 "<<"문자열

a = %W(a b c).each {|a| a += "\n"} 
a.each {|a| print a} 

dispays에 : ABC가

무슨 일이 발생 차?

+0

지금까지 어떤 연구를 수행 했습니까? 'a.inspect' 인쇄를 시도 했습니까? –

답변

2

<<은 내부에서 수정자인 수정 자입니다. 즉, 문자열에 포함 된 내용이 변경됩니다. +=의 추가 할당 연산자가 변수의 포인터를 변경하지만 원래 개체는 변경하지 않습니다.

비교 :

a = "a" 
a.object_id 
# => ...4680 

a += "b" 
a.object_id 
# => ...3960 

a

지금은 완전히 다른 개체를 가리키고 있습니다. each 루프 안에서이 작업을 수행하면 배열에 저장된 원래 개체가 변경되지 않고 루프의 반복 범위에 대해서만 존재하는 변수가 변경됩니다.

한 단계 더 나아가 :

a << "c" 
a.object_id 
# => ...3960 

그것은 여전히 ​​같은 객체입니다. 배열이나 해시 같은 컨테이너 유형 객체와 같은 문자열은 내부 수정을 수행하는 일부 메소드와 사본을 리턴하는 메소드가있는 경우가 많습니다. String#subString#sub! 사이에는 큰 차이가 있습니다.

관련 문제