【问题标题】:__FILE__ returns different value when using binding.pry__FILE__ 在使用 binding.pry 时返回不同的值
【发布时间】:2018-12-13 23:51:36
【问题描述】:

__FILE__ 返回当前 Ruby 脚本文件的路径。

一个潜在的重要问题是,如果使用binding.pry__FILE__ 的计算结果为(pry)。根据是否在 binding.pry 的上下文中评估 __FILE__ 来评估不同的值可能会有问题。例如,

$stdout.print "****************************************\n\n"
$stdout.print "FILE: #{__FILE__}\n\n"
$stdout.print "****************************************\n\n"

binding.pry

当脚本在binding.pry 暂停时,我得到:

__FILE__
# >> (pry)

有没有人知道任何机制来获取当前文件的路径,即使在binding.pry 的上下文中?

【问题讨论】:

  • 停止前分配。 current_file = __FILE__; binding.pry
  • 仅供参考,您不需要使用 pry,因为 Ruby 2.4:binding.irb 是内置的并且在很大程度上是等效的。
  • @Max IRB 中的问题与 pry 中的问题相同。
  • @anothermh 是的,我的评论与问题完全无关。只是指出 pry 不再需要

标签: ruby pry binding.pry


【解决方案1】:

使用_file_ 而不是__FILE__。例如,给定两个文件:

# foo.rb
require 'pry'
require './bar'
binding.pry
b = Bar.new

和:

# bar.rb
require 'pry'
class Bar
  def initialize
    binding.pry
  end
end

使用ruby foo.rb 运行它们:

ruby foo.rb

From: /Users/username/foo.rb @ line 3 :

    1:     require 'pry'
    2:     require './bar'
 => 3:     binding.pry
    4:     b = Bar.new

(main):1 ⇒ _file_
=> "/Users/username/foo.rb"
(main):2 ⇒ exit

From: /Users/username/bar.rb @ line 4 Bar#initialize:

    3: def initialize
 => 4:   binding.pry
    5: end

(#<Bar:0x00007fbb6caaff08>):1 ⇒ _file_
=> "/Users/username/bar.rb"

_file_ 和任何其他局部变量名称可以在binding.local_variables 中找到。

【讨论】:

    【解决方案2】:

    Sergio Tulentsev 提出了一个简单的建议,在调用 binding.pry 之前将 __FILE__ 分配给一个变量。

    anothermh,提到了_file_,它在绑定pry中可用。

    最后,我把两个答案结合起来:

    # When in the context of binding.pry, __FILE__ resolves to '(pry)',
    # binding contains the local variable _file_ which always resolves to
    # the current file, even when being evaluated in the context of binding.pry .
    # _file_ is only available, in binding. This does the trick:
    
    current_file = __FILE__.downcase == '(pry)' ? _file_ : __FILE__
    

    【讨论】:

    • 请注意_file_ 返回绝对路径,而__FILE__ 不返回,因此如果您随后解析current_file 的值,请不要指望它们完全可以互换。我看不出有任何理由不继续使用 __FILE__,因为我唯一能看到 _file_ 是必要的时候是手动输入 REPL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2020-05-05
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多