Ruby 'Требует', чтобы операторы вошли или вне определения класса?

Если вы используете платформу тестирования, например Mocha , с библиотекой утверждений Chai , вы можете использовать равенство deep для сравнения массивов.

expect(a1).to.deep.equal(a2)

Это должно возвращать true, только если массивы имеют равные элементы в соответствующих индексах.

43
задан Ash 3 March 2009 в 15:55
поделиться

5 ответов

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

В сущности необходимо поместить их в вершину, таким образом, люди видят зависимости файла сразу. Это - традиционное место для него.

52
ответ дан Chuck 23 September 2019 в 12:24
поделиться

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

Так, лучше помещает их наверху для предотвращения любого беспорядка.

10
ответ дан Jörg W Mittag 23 September 2019 в 12:24
поделиться

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

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

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'

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

4
ответ дан John T 23 September 2019 в 12:24
поделиться

наверху.

require 'rubygems'
require 'fastercsv'

class MyClass
  # Do stuff with FasterCSV
end
21
ответ дан Franklin Yu 23 September 2019 в 12:24
поделиться

Я вижу, что возможная причина для того, чтобы не помещать a require наверху файла: где дорого загрузиться и не всегда выполняемое. Один случай, который происходит со мной, - то, где, например, код и его тесты находятся в том же файле, который является чем-то, что мне нравится делать время от времени для маленького кода библиотеки в частности. Затем я могу петлять от своего редактора и тестового прогона. В этом случае, когда файл required в откуда-либо, я не хочу 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
14
ответ дан Mike Woodhouse 26 November 2019 в 21:54
поделиться