`绑定.pry` 与 `pry`

Fra*_*ues 3 ruby pry

pry调用和 和有什么不一样binding.pry?例如:

require 'pry'

class Bookshop
  def initialize(book)
    @books = []
    @hp = 'harry potter'
    lotr = 'lord of the rings'
    @books << @harry_potter
    @books << lord_of_the_rings
    @books << book
    binding.pry #OR pry
  end

  def print_all_books
    puts @books.join(', ')
  end
end

new_bookshop = Bookshop.new('the hobbit')
Run Code Online (Sandbox Code Playgroud)
  • binding.pry使我能够访问实例变量@hp、局部变量lotr和实例方法print_all_books
  • pry提供对实例变量和方法的访问,但抛出NameError: undefined local variablefor lotr

两者都表示相同的上下文。这里发生了什么?pry是否存在需要调用的情况binding.pry

max*_*ner 5

重申我在评论中所说的话。

如果您查看该方法的源代码(http://www.rubydoc.info/github/pry/pry/Object),它是在 Object 上修补的,这意味着您基本上可以在任何东西上调用它。self无论您如何称呼它,都会成为随后的 REPL 中的值。pryself.pryPry.start(self)都做同样的事情。

binding是一种神奇/复杂的东西,它捕获某个位置的“上下文”,并使这些局部变量可以从其他地方访问。通过使用binding.pryorPry.start(binding)确保局部变量在 REPL 的范围内(具体如何,我不能说)。

您还可以binding在其他想要在其他范围内引用局部变量的地方看到使用。例如,要评估 ERB 字符串,您可以使用ERB.new(string).result(binding).