Очевидная утечка глобальной области видимости в Ruby - PullRequest
1 голос
/ 29 ноября 2010

Я вижу действительно странную проблему с этим кодом и примером выполнения: https://gist.github.com/720278

Данные в этих двух файлах идентичны, но по какой-то причине приложение перестает работать во втором файле. Запуск приложения только для этого файла работает нормально, он прерывается только тогда, когда несколько файлов обрабатываются в одном исполнении. Исключения не помогают мне отследить все (жалуются на map (), которые работают нормально).

Я надеялся, что кто-то мог видеть что-то подобное раньше и мог указать мне правильное направление.

1 Ответ

2 голосов
/ 29 ноября 2010

Ваш код работает в MRI 1.9, но не в MRI 1.8.7.Проблема, в данном случае, заключается в разнице в том, как работает подписка на строки.

def split_comments!
  @comments = @input_data.select { |line| line[0] == "#" }
  parse_header_attributes
  @input_data.delete_if { |line| line[0] == "#" }
end

Этот метод предназначен для отделения комментариев от данных путем изучения первого символа каждой строки с помощью line[0].В Ruby 1.9 это возвращает первый символ в виде строки.однако в Ruby <1,9 первый символ возвращается как целое число.Чтобы это работало в более старых версиях ruby, используйте <code>line[0..0] вместо line[0]:

def split_comments!
  @comments = @input_data.select { |line| line[0..0] == "#" }
  parse_header_attributes
  @input_data.delete_if { |line| line[0..0] == "#" }
end

Возможно, вам будет проще использовать регулярное выражение для проверки комментариев: line =~ /^#/.Метод Array#partition также будет хорошо работать здесь:

def split_comments!
  @comments, @input_data = @input_data.partition do |line|
    line =~ /^#/
  end
  parse_header_attributes
end

С вашими обновлениями в git-дереве он запускается для меня без ошибок, при обработке нескольких файлов и при выполнении дважды подряд.

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