Ruby 展开路径(";../../Gemfile";,&uuuuuu文件)这是如何工作的?档案在哪里?

Ruby 展开路径(";../../Gemfile";,&uuuuuu文件)这是如何工作的?档案在哪里?,ruby,Ruby,ENV[“BUNDLE\u GEMFILE”]=File.expand\u path(“../../GEMFILE”,\uuuuuuu File) 我正试图从某个目录访问一个.rb文件,一个教程告诉我使用此代码,但我看不出它是如何找到gem文件的。两个参考: 我今天偶然发现了这一点: 如果从目录树中的boot.rb向上移动两个目录: 您看到Gemfile,这让我相信File.expand\u path(“../../Gemfile””,\uu\u File\uu)引用了以下文件:/pat

ENV[“BUNDLE\u GEMFILE”]=File.expand\u path(“../../GEMFILE”,\uuuuuuu File)

我正试图从某个目录访问一个.rb文件,一个教程告诉我使用此代码,但我看不出它是如何找到gem文件的。

两个参考:

  • 我今天偶然发现了这一点:

    如果从目录树中的boot.rb向上移动两个目录:

    您看到Gemfile,这让我相信
    File.expand\u path(“../../Gemfile””,\uu\u File\uu)
    引用了以下文件:
    /path/to/this/File/。/../Gemfile

    File.expand_path('../../Gemfile', __FILE__)
    
    是一种有点难看的Ruby习惯用法,用于在知道相对于当前文件的路径时获取文件的绝对路径。另一种书写方式是:

    File.expand_path('../Gemfile', File.dirname(__FILE__))
    
    两者都很难看,但第一种变体较短。然而,在掌握窍门之前,第一种变体也是非常不直观的。为什么额外的
    ?(但第二种变体可能给出了为什么需要它的线索)

    其工作原理如下:
    File.expand\u path
    返回第一个参数相对于第二个参数(默认为当前工作目录)的绝对路径<代码>\uuuu文件\uuuu是代码所在文件的路径。由于本例中的第二个参数是指向文件的路径,并且
    file.expand\u path
    假定为目录,因此我们必须在路径中附加一个
    ,以获得正确的路径。这就是它的工作原理:

    File.expand\u path
    基本上是这样实现的(在下面的代码中,
    path
    的值为
    。/../Gemfile
    relative\u to
    的值为
    /path/to/File.rb
    ):

    def File.expand_path(path,relative_to=Dir.getwd)
    #首先将两个参数连接起来,第二个参数先连接起来
    绝对路径=File.join(相对路径)
    而绝对路径包含?(“…”)
    #删除第一次出现的/。。
    绝对路径=绝对路径.sub(%r{/[^/]+/\.\.},,)
    结束
    绝对路径
    结束
    
    (还有一点,它将
    ~
    扩展到主目录,等等——上面的代码可能还有一些其他问题)

    单步调用上面的代码
    绝对路径
    将首先获得值
    /path/to/file.rb/./../Gemfile
    ,然后对于循环中的每一轮,将删除第一个
    ,以及它前面的路径组件。首先删除
    /file.rb/。
    ,然后在下一轮中删除
    /to/。
    ,我们得到
    /path/Gemfile

    长话短说,
    File.expand_path('../../Gemfile',uuu File_uu)
    是一个技巧,当您知道相对于当前文件的路径时,可以获取文件的绝对路径。相对路径中的额外
    用于删除
    中的文件名


    在Ruby 2.0中有一个名为
    \uuuuu dir\uuuuu
    内核
    函数,它被实现为
    File.dirname(File.realpath(\uuuu File\uuuuu))

    谢谢您的帖子,但这来自gembundler教程,所以我试图准确地理解他们是如何做到的:)还有一个问题,除了与Ruby 1.9.2之前的版本不兼容之外,还有什么原因不应该只使用“require_relative”呢?从Ruby 2.0开始,您可以使用
    File.expand_path(“../Gemfile”、\uu dir_u)
    Theo的这一行终于让它为我点击了
    文件。扩展路径假定一个目录
    ,即使
    \uuuuuu文件
    不是一个目录。为了让事情变得有意义,请使用
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
    
    def File.expand_path(path, relative_to=Dir.getwd)
      # first the two arguments are concatenated, with the second argument first
      absolute_path = File.join(relative_to, path)
      while absolute_path.include?('..')
        # remove the first occurrence of /<something>/..
        absolute_path = absolute_path.sub(%r{/[^/]+/\.\.}, '')
      end
      absolute_path
    end