среда, 21 апреля 2010 г.

Замечательная конструкция __END__

Источник

Она замечательна тем, что позволяет существенно упростить хранение и доступ к тестовым данным, если они должны находиться в отдельном файле.
Допустим, пишешь класс - обработчик каких-то особенных файлов данных. Написал тест, файл с тестовыми данными, затем библиотеку (или в другом порядке). Удобно иметь библиотеку, тест и данные в одном файле. Здесь выручит директива __END__
Как она работает? Весь текст в файле после этой директивы становится доступен как содержимое объекта с именем DATA класса IO (файл). Он уже открыт, его можно читать. В простейшем виде получается так:
puts DATA.read
__END__тут уже пошло содержимое объекта DATAвторая строка этого содержимого и т.д.

Тестовый код можно прикрепить при помощи конструкции if __FILE__ == $0
module MyModule
  class MyClass
    def test_process_io io
      puts io.read
    end
  end
end

if __FILE__ == $0
  # код выполняется когда выполнен запуск ruby название_файла_этого_сценария.rb
  # а когда сенарий просто подключается require - не выполняется
  # сюда удобно помещать тестовый код
  MyModule::MyClass.new.test_process_io DATA
end

# а сюда удобно помещать тестовые данные
__END__
the first line is to be read from DATA IO
the second line is to be read from DATA IO
...

Комментариев нет:

Отправить комментарий

Ярлыки