2013-02-09 3 views
1

Я изучаю поведение метода в Ruby, чтобы узнать, когда создается новый объект. Я понимаю (1), идентичен (2), а (3) идентичен (4). Но я не понимаю, почему (5) не идентично (6).Как сделать ломтик и ломтик! влияют на object_id в Ruby?

(1) upto (6) описаны ниже с моим исходным кодом.

Так что я хотел бы понять, когда object_id будет изменен (недавно назначен) в Ruby. Кто-нибудь объясняет это кратко?

спасибо, что заранее.

исходный код

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 представляет собой другой определенной (но произвольная) строки. Не путайте X и Y с переменными; они просто представляют разные объекты для объяснения поведения.

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 
Смежные вопросы