Зачем ставить оператор require в конце файла ruby? - PullRequest
1 голос
/ 24 июня 2019

Я видел это в своем недавно унаследованном проекте ruby ​​/ rails, и задавался вопросом:

module Canonicalizer
  # Redirects the client to the canonical url
  #
  # @return [undefined]
  #
  # @api private
  def redirect_to_canonical_url
    if request.get? && !canonical_url?
      redirect_to canonical_url, status: :moved_permanently
      false
    else
      true
    end
  end

  # Test if the current request URL is canonical
  #
  # @return [Boolean]
  #
  # @api private
  def canonical_url?
    request.path == canonical_url
  end

end

require 'canonicalizer/hub_page_canonical'

Ответы [ 3 ]

4 голосов
/ 24 июня 2019

Ruby-код не компилируется, он обрабатывается [в основном] так, как он поступает в парсер.Тем не менее, следующие два фрагмента кода не эквивалентны:

class Foo; def foo; :first; end; end
class Foo; def foo; :second; end; end
Foo.new.foo #⇒ :second

против

class Foo; def foo; :second; end; end
class Foo; def foo; :first; end; end
Foo.new.foo #⇒ :first

Кроме того, Kernel#require является обычной функцией, определенной дляKernel модуль.Я мог бы подумать, что файл 'canonicalizer/hub_page_canonical' зависит от модуля Canonicalizer (например, он содержит определение класса include Canonicalizer.) Чтобы это было возможно, включенный модуль должен быть объявлен заранее, поэтому require следует после егоопределение.

0 голосов
/ 25 июня 2019

Странно видеть require в приложении rails, которого там быть не должно. Тем не менее, причина, по которой мне пришлось это сделать, заключалась в том, чтобы избежать бесконечного цикла, когда одному файлу требуется другой для разрешения их констант (через автозагрузчик rails).

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

0 голосов
/ 24 июня 2019

Одной из возможных причин является то, что происходит что-то, когда библиотека требуется через require 'canonicalizer/hub_page_canonical', и действует иначе, если эти методы не определены в module Canonicalizer.

Может быть метапрограммирование какого-либо типа илипросто эти методы вызываются во время загрузки кода.

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

...