`binding.pry` vs`pry`

时间:2017-12-21 01:04:56

标签: ruby pry

致电prybinding.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')
  • binding.pry可让我访问实例变量@hp,局部变量lotr和实例方法print_all_books
  • pry可以访问实例变量和方法,但会为NameError: undefined local variable抛出lotr

两者都表示相同的背景。这里发生了什么?是否需要在pry之上调用binding.pry

1 个答案:

答案 0 :(得分:1)

重复我在评论中所说的内容。

如果你查看方法的源代码(http://www.rubydoc.info/github/pry/pry/Object),它会在Object上修补,这意味着你可以在任何东西上调用它。无论你怎么称呼它都会成为随后REPL中 Fragment f1 = getActivity().getSupportFragmentManager().findFragmentById(R.id.id_frame); if (f1 instanceof TasksFragment) { Log.d("", "GCM Receiverf1task:Tasks"); // ((TasksFragment) f1).updateUI(message, order); } else if (f1 instanceof DetailFragment) { Log.d("", "GCM Receiverf1task:Tasks Details"); // if(message.contains("Started") || message.contains("Completed") || message.contains("cancelled")) // ((DetailFragment) f1).updateUI(message, order); } 的值。 selfpryself.pry都做同样的事情。

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

您还会在其他地方看到Pry.start(binding),您想要在其他范围内引用局部变量。例如,要评估一串ERB,您可以使用binding