2014-04-10 6 views
2

누구나 foo이 버전 1에서 변형 된 이유를 설명 할 수 있습니까? <<= 과제의 차이점은 무엇입니까?<<와 =의 차이점

버전 1

foo = "apple" 
bar = foo 
"foo: #{foo}" # => foo: apple 

bar << "hello" 
"bar: #{bar}" # => bar: applehello 
"foo: #{foo}" # => foo: applehello 

버전 2

foo = "apple" 
bar = foo  
"foo: #{foo}" # => foo: apple 

bar = bar + "hello" 
"bar: #{bar}" # => bar: applehello 
"foo: #{foo}" # => foo: apple 
+1

왜 downvote? 제발 코멘트 –

+1

[문자열 연산자 사이의 차이 +와 루비의 <<] 중복 (http://stackoverflow.com/questions/15461966/difference-between-string-operators-and-in-ruby) –

답변

3

=은 귀하가 말한대로 할당되어 있습니다.
그러나 <<은 할당이 아닙니다. 왼쪽 피연산자가 문자열 인 경우 연결 연산자입니다.

bar << "hello" 

가 인 -을 수행
그래서 : 동안

bar = bar + "hello" 

는 "안녕하세요"다음이 새 문자열 변수 bar에 할당으로 bar의 내용을 결합하여 새로운 문자열을 생성 문자열의 자리 연결 - bar은 새 문자열로 설정되지 않지만 보유하는 문자열은 수정됩니다.

따라서 << bar와 foo는 여전히 동일한 객체에 대한 참조를 유지하는 반면 = 막대는 새로운 값을 얻습니다. +

+0

그래서 << operation, ruby는 foo 인 bar의 참조를 찾고 foo가 참조하는 "apple"문자열을 찾는다. 그리고 연결을합니까? –

+0

@KitHo 둘 다'bar'와'foo'는 같은 객체를 참조합니다. 포인터 체인이 아닙니다. – Stefan

+0

거의. 그러나 당신은 좋은 길을 가고 있습니다. 'bar'에 접근 할 때 두 변수가 같은 객체를 참조하기 때문에'foo'를 찾을 필요가 없습니다. 그러므로이 객체를'<<'로 수정하면 여전히 동일한 객체이기 때문에'foo'와'bar'에 모두 영향을 미칩니다. '='를 사용하면 "지금부터 다른 객체를 참조 할 수있는 bar를 원합니다"라고 말합니다. – ElmoVanKielmo

0

당신은 foo에 대한 참조로 bar을 설정하고 있습니다. << 연산자는 첫 번째 버전 에서처럼 작동하고 두 번째 버전에서는 +을 사용하여 원본을 변경하지 않고 새 값을 생성합니다. bar = bar + "hello" 문자열의 복사본을 생성하면서

0

bar << "hello"foo가 그대로 유지 (foo이다) bar에 추가한다.

0

문자열 연결은 새로운 객체 반환 개체에 대한

http://www.ruby-doc.org/core-2.1.0/String.html#method-i-2B

추가] 연산자의 행위를 그에 대한 참조 점 : 당신이 첫 번째 예에서

http://www.ruby-doc.org/core-2.1.0/String.html#method-i-3C-3C

foo와 bar가 가리키는 객체에 추가.

두 번째 예제에서 바를 가리키는 객체에 "hello"를 추가하면 바는 이제 새로운 객체를 반환하고 bar는 이제 모든 객체를 가리키며 foo는 값이 여전히 " 애플은 "

0

먼저 다음 사항을 준수하십시오 -

str = "test" 
#=> "test" 
str[1] 
#=> "e" 
str1 = str 
#=> "test" 
str.object_id 
#=> 8509820 
str1.object_id 
#=> 8509820 

그래서 문자열은 루비의 각 문자의 배열로 저장됩니다. Java와 같은 다른 언어도 char 유형 참조 만 사용하는 경우 완전한 문자열을 반환합니다. 마찬가지로 여기서도 두 번째 문자열의 각 문자를 첫 번째 문자열의 문자 배열에 추가합니다.

str << "string" 
#=> "teststring" 
str1 
#=> "teststring" 
str.object_id 
#=> 8509820 
str1.object_id 
#=> 8509820 

새 개체가 생성되지 않습니다. 동일한 배열은 두 번째 문자열의 각 문자를 보유합니다.

이제 다음을 준수하십시오 - 여기

str = "test" 
#=> "test" 
str1 = str 
str.object_id 
#=> 9812345 
str1.object_id 
#=> 9812345 

str = str + "string" 
#=> "teststring" 
str.object_id 
#=> 99
str1 
#=> "test" 
str1.object_id 
#=> 9812345 

우리가 볼 + 운영자가 새로운 객체의 생성을 야기한다.