【问题标题】:What is '$:.unshift File.dirname(__FILE__)' doing?'$:.unshift File.dirname(__FILE__)' 在做什么?
【发布时间】:2011-07-06 13:46:22
【问题描述】:

下面是做什么的,为什么会出现在页面顶部?

$:.unshift File.dirname(__FILE__)

https://github.com/mojombo/jekyll/blob/master/lib/jekyll.rb

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

它将当前工作目录路径添加到项目中使用的所有require中,在顶部添加后我们不需要关心我们需要的文件路径,但是我们需要的所有文件都必须在我们的主程序需要其他文件的同一目录。

$: 是加载路径的保留关键字。

【讨论】:

    【解决方案2】:

    从技术上讲,它是将文件的路径添加为 ruby​​ 用于查找文件的加载路径的第一个条目。 $: 是一个神奇的变量,更清楚地被 $LOAD_PATH 引用。

    ruby-1.9.2-p136 > $LOAD_PATH
     => ["/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
    ruby-1.9.2-p136 > $:
     => ["/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
    ruby-1.9.2-p136 > $:.unshift '.'
     => [".", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
    

    【讨论】:

    • 我知道这是一个非常古老的问题,但是否有理由将其添加到头部而不是尾部(例如推)?这是否使其以类似联合的方式优先于具有相同名称的文件? (一个修补程序文件夹)。
    • @mckenzm 是的。您将其添加到头部是因为您希望在加载路径中首先发现当前目录中的文件。查找文件时,加载路径从头到尾依次遍历。
    • 这就是我的目标,所以对于开发,单元测试目录优先于集成测试目录等。
    【解决方案3】:

    它将当前文件的目录添加到加载路径。 $: 表示加载路径(它是一个数组),unshift 位于数组的开头。

    它在那里(并且在顶部)的原因是所有需要的人都不必担心路径。

    【讨论】:

    • 感谢您的回答。在加载路径中添加一些东西有什么好处/意义?可以只使用require 来访问一个 ruby​​ 文件,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2014-06-11
    • 2010-09-18
    相关资源
    最近更新 更多