Как мы можем удалить объект (имеющий целочисленный идентификатор)? - PullRequest
3 голосов
/ 18 февраля 2011

Я хотел бы удалить объект, я не могу. Вот пример:

irb(main):001:0> str = "hello"
"hello"
irb(main):003:0> str.object_id
2164703880
irb(main):004:0> str = nil
nil
irb(main):005:0> str.object_id
4

Как видите, я могу просто установить переменную объекта на nil (и тогда, конечно, его идентификатор объекта будет 4). И после этого сборщик мусора автоматически удалит неиспользуемый объект с идентификатором: 2164703880.

Но нет, я этого не хочу. Я хочу удалить этот объект.

Спасибо за любые идеи, предложения.

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Вы не можете удалить локальную переменную в Ruby. Вы можете использовать remove_class_variable, remove_instance_variable и remove_const, но вы не можете сделать это для локальных переменных.

В вашем коде вы фактически удаляете строковый объект или, по крайней мере, сборщик мусора удаляет его. Единственное, что вы держите в руках, это указатель с именем str, указывающий на ноль. Но фактический строковый объект больше не будет существовать.

Один из способов убедиться, что ваши переменные не определены, - обернуть их в Proc. Конечно, в этом есть недостаток создания Proc, и гораздо проще позволить Ruby выполнять сборку мусора. Если вы хотите использовать proc, он определит свою собственную привязку, и вы можете принудительно использовать локальные переменные, например:

Proc.new{ |;str| str = "hello"; puts str.object_id }.call
  2227691880
  => nil
defined?(str)
  => nil

Имейте в виду, что Ruby является объектно-ориентированным языком программирования, поэтому проще иметь дело с переменными внутри объектов, а не беспокоиться о переменных глобальной области видимости. Если ваши переменные определены внутри функций и объектов, они остаются локальными для этих функций и объектов и прекратят свое существование после удаления объектов.

0 голосов
/ 18 февраля 2011

Я не думаю, что вы можете, и это хорошо, потому что

>> str = "hello"
str = "hello"
=> "hello"
>> str2 = str
str2 = str
=> "hello"
>> str.object_id
str.object_id
=> 2157491040
>> str2.object_id
str2.object_id
=> 2157491040
>> str = nil
str = nil
=> nil
>> str.object_id
str.object_id
=> 4
>> str2.object_id
str2.object_id
=> 2157491040
>> 

Я бы не хотел, чтобы мой str2 исчез, потому что где-то еще в программе str было "удален».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...