代码之家  ›  专栏  ›  技术社区  ›  Richie Thomas

为什么“file.expand_path(…)”解析为与我期望的不同的内容?

  •  0
  • Richie Thomas  · 技术社区  · 5 年前

    我目前正在逐步通过 gitlab_development_kit 看看它是如何工作的。

    我现在在 this line of code ,我在行的上方和下方放置了一个调试器点。

        3: require 'byebug'
        4: byebug
        5: 
    =>  6: $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
        7: byebug
        8: require 'gitlab_development_kit'
    

    我检查了 $LOAD_PATH File.expand_path('../../lib', __FILE__) :

    (byebug) $LOAD_PATH
    ["/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash", ...]
    
    (byebug) File.expand_path('../../lib', __FILE__)
    "/Users/richiethomas/Workspace/ThreeEasyPieces/lib"
    

    I型 next 要推进调试器,然后重新检查以上值:

    (byebug) next
    
    [2, 11] in /Users/richiethomas/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/gitlab-development-kit-0.2.5/bin/gdk
        2: require 'yaml'
        3: require 'byebug'
        4: byebug
        5: 
        6: $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
    =>  7: byebug
        8: require 'gitlab_development_kit'
        9: 
       10: 
       11: 
    
    (byebug) File.expand_path('../../lib', __FILE__)
    "/Users/richiethomas/Workspace/ThreeEasyPieces/lib"
    
    (byebug) $LOAD_PATH
    ["/Users/richiethomas/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/gitlab-development-kit-0.2.5/lib", "/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash", ...]
    

    如果 文件。展开“路径”(“../../lib”,“文件”)。 真的是 "/Users/richiethomas/Workspace/ThreeEasyPieces/lib" ,那就是我所期望的 $加载路径 . 但是,它看起来像 lib rbenv管理的gem版本中的dir是预挂起的。这是什么恶魔的魔法?-)

    1 回复  |  直到 5 年前
        1
  •  2
  •   Jörg W Mittag    5 年前

    __FILE__ 提示时的值与 _文件__ 在文件中。事实上, _文件__ 是当前正在执行的文件,但在交互式提示下, 没有 当前正在执行文件,ergo, _文件__ 只是一个占位符。

    在IRB内, _文件__ 计算结果为 '(irb)' 在Pry中,它的计算结果为 '(pry)' 在Byebug中,它评估为 '(byebug)' :

    (byebug) __FILE__
    "(byebug)"
    

    自从 (byebug) 是完全合法的文件名, File.expand_path 将使用当前工作目录展开它。例如,如果当前工作目录是 /a/b/c , File.expand_path(__FILE__) 将评估为 /a/b/c/(byebug) . 埃尔戈

    File.expand_path('../../lib', __FILE__)
    

    然后将扩展到

    '/a/b/lib'