为什么在红宝石文件的末尾放置require语句?

时间:2019-06-24 14:48:00

标签: ruby-on-rails ruby 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'

3 个答案:

答案 0 :(得分:4)

Ruby代码未编译,正在解析器中[大部分]被处理。也就是说,以下两段代码并不等效:

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

vs。

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紧随其定义。

答案 1 :(得分:0)

一个可能的原因是,当通过require 'canonicalizer/hub_page_canonical'要求使用库时,如果未在module Canonicalizer上定义这些方法,则会发生某些变化。

可能是某种类型的元编程,或者仅仅是在代码加载时调用了这些方法。

Ruby是一种语言,代码可以在加载时和运行时同时运行。

答案 2 :(得分:0)

在Rails应用中看到require很奇怪,这本不应该出现。话虽这么说,我必须这样做是为了避免无限循环,当一个文件需要另一个文件来解析其常数时(通过rails autoloader)。

我的建议是忘记这一点,删除所有看到的require,并通过文件和文件夹名称的约定使用标准自动加载。