Ruby Symbol # to_proc приводит к утечке ссылок в 1.9.2-p180?

Хорошо, это моя вторая попытка отладить проблемы с памятью с помощью моего приложения Sinatra. На этот раз я думаю, что на этот раз я записал ее в простой пример кода.

Кажется, когда я фильтрую массив через .map (&: some_method) , это приводит к тому, что элементы в этом массиве не собираются сборщиком мусора. Запуск эквивалентного .map {| x | x .some_method} совершенно нормально.

Демонстрация: Дан простой пример класса:

class C
  def foo
    "foo"
  end
end

Если я запустил следующее в IRB, он будет собран нормально:

ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
 => [...]
ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo}
 => ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
 => 10
ruby-1.9.2-p180 :004 > a = nil
 => nil
ruby-1.9.2-p180 :005 > b = nil
 => nil
ruby-1.9.2-p180 :006 > GC.start
 => nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
 => 0

Так что больше не существует ссылок на C. Хорошо. Но при замене map {| x | x.foo} на map (&: foo) (который рекламируется как эквивалент) он не собирается:

ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
 => [...]
ruby-1.9.2-p180 :002 > b = a.map(&:foo)
 => ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
 => 10
ruby-1.9.2-p180 :004 > a = nil
 => nil
ruby-1.9.2-p180 :005 > b = nil
 => nil
ruby-1.9.2-p180 :006 > GC.start
 => nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
 => 10
ruby-1.9.2-p180 :008 >

Это рубиновая ошибка? I ' Я попробую использовать другие версии Ruby, чтобы убедиться, но это кажется очевидной проблемой. Кто-нибудь знает, что я делаю не так?

Редактировать:

Я пробовал это в 1.8.7-p352, и это не так. у меня есть проблема. 1.9.3-preview1 есть , но все еще есть i ssue. Отчет об ошибке в порядке или я что-то делаю не так?

Edit2: форматирование (почему размещение четырех пробелов перед каждой строкой приводит к выделению синтаксиса, а теги

  - нет?) 

5
задан Ken Simon 31 August 2011 в 22:37
поделиться