2013-02-09 3 views
1

나는 Ruby에서 object_id 메소드의 동작을 연구하여 새로운 객체가 언제 생성되는지를 알고있다. 나는 (1)이 (2)와 동일하고 (3)이 (4)와 동일하다는 것을 이해할 수있다. 그러나 나는 (5)가 (6)과 동일하지 않다는 것을 이해하지 못한다.어떻게 슬라이스하고 슬라이스합니까! 루비의 object_id에 영향을 줍니까?

(1) 개까지 (6) 내 소스 코드와 함께 아래에 설명되어 있습니다.

그래서 Ruby에서 object_id이 (새롭게 할당 됨) 변경 될 때를 알고 싶습니다. 아무도 그것을 간결하게 설명하지 않습니까?

대단히 감사합니다.

소스 코드

a = "foo" 
b = a 
b.slice!(0) 

p a.object_id # (1) 
p b.object_id # (2) 

b = b 

p a.object_id # (3) 
p b.object_id # (4) 

b = b.slice(0) 

p a.object_id # (5) 
p b.object_id # (6) 

결과

70302398954840                                              
70302398954840 
70302398954840 
70302398954840 
70302398954840 
70302398954680 

답변

3

변수가 아닌 개체와 개체 변이하는 것은 객체가 무엇 변경되지 않습니다. 즉, 객체를 변경하면 어떤 변수가 해당 객체를 평가하는지 결코 변경되지 않습니다.

두 방법 사이의 차이가 slice! (! ICK) 원래 문자열/오브젝트와 변이합니다 slice 원래 (예!) 돌연변이없이 새로운 캐릭터/오브젝트를 반환한다. 다음에 X

특정한 (그러나 임의) 스트링을 나타내고, Y 다른 특정한 (그러나 임의) 문자열을 나타낸다. XY을 변수와 혼동하지 마십시오. 그들은 단순히 행동을 설명하는 다른 대상을 나타냅니다.

a = X    # a = X 
b = a    # b = a -> b = X, so b = X 
b.slice!(0)   # MUTATE object X 

p a.object_id # (1) # a = X 
p b.object_id # (2) # b = X 

b = b    # b = b -> b = X, so b = X (no effect) 

p a.object_id # (3) # a = X 
p b.object_id # (4) # b = X 

b = b.slice(0)  # b = f(b), where NEW object (Y) is returned, so b = Y 

p a.object_id # (5) # a = X 
p b.object_id # (6) # b = Y 
관련 문제