2010-11-29 4 views
1

Я вижу очень странные проблемы с этим кодом и образец исполнения: https://gist.github.com/720278Кажущаяся глобальной утечки области видимости в Руби

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

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

+0

Я получаю другую ошибку, в строке 49, «не может преобразовать nil в Float (TypeError)» – wdebeaum 2010-11-29 18:39:25

+0

& wdebeum, какую версию рубина вы используете? – Brian 2010-11-29 18:43:52

ответ

2

Ваш код работает в МРТ 1.9, но не в МРТ 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, однако, это возвращает первый символ как целое число. Для этого, чтобы работать в более старых версиях рубина, используйте 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 

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

Смежные вопросы