Добавление в каталог в $Path нагрузки (Рубин)



Я видел два часто используемых метода для добавления каталога файла, который в настоящее время выполняется в $LOAD_PATH (или $:). Я вижу преимущества этого в случае, если вы не работаете с драгоценным камнем. Одно кажется более многословным, чем другое, очевидно, но есть ли причина идти с одним над другим?



первый, подробный метод (может быть перебор):



$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))


и более простой, быстрый и грязный:



$:.unshift File.dirname(__FILE__)


никаких оснований идти с одним над другим?

544   6  

6 ответов:

Я бы сказал, пойти с $:.unshift File.dirname(__FILE__) над другой, просто потому, что я видел гораздо больше использования его в коде, чем $LOAD_PATH один, и он тоже короче!

путь загрузки Ruby очень часто рассматривается как$:, но только потому, что он короткий, не делает его лучше. Если вы предпочитаете ясность уму, или если краткость сама по себе вызывает у вас зуд, вам не нужно делать это только потому, что все остальные. Привет ...

$LOAD_PATH

... и попрощаться ...

# I don't quite understand what this is doing...
$:

Я не слишком люблю "быстрый и грязный" путь. Любой новичок в Ruby будет размышлять о том, что $:. - это.

Я нахожу это более очевидным.

libdir = File.dirname(__FILE__)
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)

или если я забочусь о том, чтобы иметь полный путь...

libdir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)

обновление 2009/09/10

в последнее время я делаю следующее:

$:.unshift(File.expand_path(File.dirname(__FILE__))) unless
    $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))

Я видел его в целой куче различных проектов ruby во время просмотра GitHub.

кажется, что съезд?

если ты типа script/console в вашем проекте Rails и введите $:, вы получите массив, который включает в себя все каталоги, необходимые для загрузки Ruby. Вынос из этого маленького упражнения заключается в том, что $: - это массив. Таким образом, вы можете выполнять на нем функции, такие как добавление других каталогов с помощью unshift способ или << оператора. Как вы подразумевали в своем заявлении $: и $LOAD_PATH то же самое.

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

пример:

у меня есть плагин, который я создал под названием todo. Мой каталог структурирован следующим образом:

/---vendor
  |
  |---/plugins
        |
        |---/todo
              |
              |---/lib
                    |
                    |---/app
                          |
                          |---/models
                          |---/controllers
              |
              |---/rails
                    |
                    |---init.rb

в init.rb файл я ввел следующий код:

## In vendor/plugins/todo/rails/init.rb
    %w{ models controllers models }.each do |dir|
      path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
      $LOAD_PATH << path
      ActiveSupport::Dependencies.load_paths << path
      ActiveSupport::Dependencies.load_once_paths.delete(path)
    end 

обратите внимание, как я говорю блоку кода выполнять действия внутри блока для строк "модели", "контроллеры" и "модели", где я повторяю "модели". (К ВАШЕМУ СВЕДЕНИЮ, %w{ ... } это просто еще один способ сказать Ruby, чтобы держать массив строк). Когда я бегу script/console, Я набираю следующее:

>> puts $:

и я набираю это так, чтобы было легче читать содержимое в строке. На выходе я получаю:

...
...
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models

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

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

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

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))

есть драгоценный камень, который позволит вам настроить свой путь загрузки с более приятным и чистым кодом. Проверьте это:https://github.com/nayyara-samuel/load-path.

Она также имеет хорошую документацию

Comments

    Ничего не найдено.