为什么将 require 语句放在 ruby​​ 文件的末尾?

ame*_*ior 2 ruby ruby-on-rails require

我在我新继承的 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'
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 6

Ruby 代码没有被编译,它[主要] 被处理,因为它涉及到解析器。也就是说,以下两段代码是不等价的:

class Foo; def foo; :first; end; end
class Foo; def foo; :second; end; end
Foo.new.foo #? :second
Run Code Online (Sandbox Code Playgroud)

对比

class Foo; def foo; :second; end; end
class Foo; def foo; :first; end; end
Foo.new.foo #? :first
Run Code Online (Sandbox Code Playgroud)

此外,Kernel#require是在Kernel模块上定义的常规函数。我可以认为'canonicalizer/hub_page_canonical'文件依赖于Canonicalizer模块(例如,它包含类的定义include Canonicalizer。)为此,必须预先声明包含的模块,因此require在其定义之后。