新手问题 ::File.expand_path ('../config/environment', __FILE__) 是什么意思?

siky · 2014年01月04日 · 最后由 ruohanc 回复于 2014年01月05日 · 4138 次阅读

在 Rails 项目默认生成的 config.ru 是这样的:

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application

其中::是什么意思?只知道作为模块的作用域操作符的用法。。

在 console 中,运行,

File.expand_path('../config/environment',  __FILE__)

::File.expand_path('../config/environment',  __FILE__)

返回的是同样的结果

都是 environment.rb 文件的路径。请问在这里::有什么用处么?

把‘../config/environment'加到 require 的搜索路径集里面。

在前面加上::表示访问在 top level 定义的常量。 你可以试着运行一下下面的代码

module Test

  class File
    def self.expand_path(foo, bar)
      "This is a test"
    end
  end

  puts File.expand_path('../config/environment',  __FILE__)
  puts ::File.expand_path('../config/environment',  __FILE__)
end

#2 楼 @IchiNiNiIchi 感谢!这个 config.ru 里面声明是::File, 是为了防止其它包含的文件里面有 File 作用域么?为什么这样设计呢?像 bin/rails 下面,就是

APP_PATH = File.expand_path('../../config/application', FILE)

没有::

因为 Ruby 有一个特性是打开类,类可以被重新定义,你永远不知道开发者会不会打开你的类,塞进去一个 File class,然后还实现了 expand_path,所以最稳妥的做法就是强制指定顶级作用域。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号