ObjectSpace.each_object(Foo).count

Я пытаюсь выяснить ObjectSpace.each_object
В консоли:

class Foo; end  
Foo.new  
ObjectSpace.each_object(Foo).count  
=> 1  
GC.start  
ObjectSpace.each_object(Foo).count  
=> 1 

Я видел примеры, и я знаю, что второй счет должен быть 0.
Есть идеи, что здесь происходит?
Благодарю.

2 ответа

Решение

Это зависит от вашей консоли.

IRB

Последний результат сохраняется как _даже если он не был явно назначен. Бег GC.start не удалит последний объект:

irb(main):001:0> class Foo; end
=> nil
irb(main):002:0>
irb(main):003:0* Foo.new
=> #<Foo:0x007fca7a309f98>
irb(main):004:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
1
=> 1
irb(main):005:0> p ObjectSpace.each_object(Foo).count; GC.start; p ObjectSpace.each_object(Foo).count
1
0
=> 0

подглядывать

Вы можете получить доступ к последнему результату и второму последнему результату с помощью _ а также __:

[1] pry(main)> 'a'
=> "a"
[2] pry(main)> 'b'
=> "b"
[3] pry(main)> p _, __
"b"
"a"
=> ["b", "a"]

Прай сохраняет все 100 последних результатов в _out_ Отделить::HistoryArray:

[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fd093102118>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> _out_[2]
=> #<Foo:0x007fd093102118>

Ты можешь использовать _out_.pop! удалить его последний элемент:

[1] pry(main)> class Foo; end
=> nil
[2] pry(main)> Foo.new
=> #<Foo:0x007fa90b1ad360>
[3] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[4] pry(main)> GC.start
=> nil
[5] pry(main)> ObjectSpace.each_object(Foo).count
=> 1
[6] pry(main)> 5.times{_out_.pop!}
=> 5
[7] pry(main)> GC.start
=> nil
[8] pry(main)> ObjectSpace.each_object(Foo).count
=> 0

Внутри сценария

Если вы выполните:

class Foo; end

Foo.new
p ObjectSpace.each_object(Foo).count

GC.start
p ObjectSpace.each_object(Foo).count

внутри скрипта вы получите:

1
0

GC.start не заставляет запускать сборщик мусора.

Это немного неясно из документации, но он просто инструктирует движок планировать сборку мусора. Тем не менее, нельзя полагаться на GC.start немедленно удалит объекты из кучи.

Другие вопросы по тегам