Вопрос о требовании файлов и пути загрузки в программировании Ruby 1.9 - PullRequest
0 голосов
/ 24 июня 2011

Я читаю "Программирование на Ruby 1.9".На странице 208 (в разделе «Куда ставить тесты») книга имеет код, организованный как

roman
    lib/
        roman.rb
        other files...
    test/
        test_roman.rb
        other_tests...
    other stuff

, и спрашивает, как мы узнаем наш файл test_roman.rb о файле roman.rb.

В нем говорится, что один из вариантов, который не работает, состоит в том, чтобы встроить путь в require операторов в тестовом коде:

# in test_roman.rb
require 'test/unit'
require '../lib/roman'

Вместо этого он говорит, что лучшее решение для всехдругие компоненты приложения предполагают, что каталог верхнего уровня приложения находится в пути загрузки Ruby, так что тестовый код будет иметь

# in test_roman.rb
require 'test/unit'
require '/lib/roman'

, и мы будем запускать тесты, вызывая ruby -I path/to/app path/to/app/test/test_roman.rb.

Мой вопрос : действительно ли это лучший способ?Кажется, что

  1. Если мы просто заменим require '../lib/roman' в первом варианте на require_relative '../lib/roman', все будет работать нормально.
  2. Предположение во втором варианте (что все компоненты имеюткаталог верхнего уровня в пути загрузки Ruby) работает только потому, что мы передаем аргумент -I path/to/app, который выглядит немного грязно.

Правильно ли, что замена require на require_relative исправляет всепроблемы?Есть ли причина предпочитать второй вариант?

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Далее, эта же книга использует require_relative (Глава 16, Организация вашего исходного кода ) в контексте тестирования, так что да, я бы сказал, что использование этого - хорошая вещь, так как он "всегда загружает файлы по пути относительно каталога файла, который его вызывает" .

Конечно, как заметил @christiangeek, require_relative - новинка в серии 1.9, но есть gem , который предоставляет вам ту же функциональность.

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

1 голос
/ 25 июня 2011

require_relative делает код чище, но изначально доступен только на Ruby> 1.9.2.Это означает, что если вы хотите, чтобы ваш код был переносимым на версии Ruby <1.9.2, вам нужно использовать расширение или обычный <code>require AFAIK.Книга, скорее всего, а) написана до того, как 1.9.2 стала широко распространенной, или б) является примером наименьшего общего знаменателя.

...