Подтвердить что ты не робот

Нужны ли инструкции Ruby "require" внутри или вне определения класса?

При использовании файлов классов в Ruby вы помещаете операторы "require" в начало файла или внутри определения класса?

4b9b3361

Ответ 1

Технически, это не имеет большого значения. require - это обычный вызов метода, и область действия, которую он вызывает, не влияет на работу. Единственное различие заключается в том, что он будет выполняться, когда какой-либо код, который он размещает, оценивается.

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

Ответ 2

вверху.

require 'rubygems'
require 'fastercsv'

class MyClass
  # Do stuff with FasterCSV
end

Ответ 3

Я вижу возможную причину не помещать require в начало файла: там, где это дорого загружать и не всегда выполняется. Один случай, который возникает для меня, это то, где, например, код и его тесты находятся в одном файле, что время от времени я делаю для небольшого библиотечного кода. Затем я могу запустить файл из моего редактора и запустить тесты. В этом случае, когда файл находится в require d в другом месте, я не хочу загружать test/unit.

Что-то вроде этого:

def some_useful_library_function()
  return 1
end

if __FILE__ == $0
  require 'test/unit'
  class TestUsefulThing < Test::Unit::TestCase
    def test_it_returns_1
      assert_equal 1, some_useful_library_function()
    end
  end
end

Ответ 4

Неважно, где вы их помещаете, но если вы поместите их внутри выражения class или module, то похоже, что вы импортируете все, что находится в файле require d, в пространство имен классов, что неверно: все заканчивается в глобальном пространстве имен (или какие-либо пространства имен определены в библиотеке).

Итак, лучше поместите их наверху, чтобы избежать путаницы.

Ответ 5

В верхней части файла большинство (но не все) языков обрабатывают импорт таким образом. Я нахожу его более чистым и более легким в обращении с ними таким образом.

Я думаю, что это имеет смысл только так... например, вы получаете середину в файле, а затем:

class Foo
  def initialize(init_value)
    @instance_var = init_value

# some 500 lines of code later....

  end
end

class Bar
# oh look i need an import now!
require 'breakpoint'

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

Ответ 6

Я чувствую, что оператор требует принадлежит внутри класса. Использование классов означает, что мы принимаем основной принцип ООП, а именно, объекты должны быть как можно более слабо связаны. Для меня это подразумевает минимизацию внешних зависимостей. Если позже я переведу класс в свой файл, я не хочу, чтобы он прерывался, потому что я не отслеживал все необходимые require утверждения, которые класс потребляет.

Это не вызывает проблем с дублированием require в файле, что упрощает рефакторинг, который неизбежно будет иметь следующий программист, который наследует ваш код.