和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')
binding.pry
让我可以访问实例变量@hp
,局部变量lotr
和实例方法print_all_books
。pry
可以访问实例变量和方法,但会为NameError: undefined local variable
抛出lotr
。两者都表明相同的背景。这里发生了什么?是否有必要在pry
上调用binding.pry
?
重复我在评论中所说的内容。
如果你查看方法的源代码(http://www.rubydoc.info/github/pry/pry/Object),它会在Object上修补,这意味着你可以在任何东西上调用它。无论你怎么称呼它都会成为随后REPL中self
的价值。 pry
,self.pry
和Pry.start(self)
都做同样的事情。
binding
是一种神奇/复杂的东西,捕捉某个地方的“背景”,并使这些局部变量可以从其他地方访问。通过使用binding.pry
或Pry.start(binding)
,您可以确保局部变量在REPL的范围内(具体而言,我不能说)。
您还可以在其他想要引用其他范围内的局部变量的地方看到binding
。例如,要评估一串ERB,您可以使用ERB.new(string).result(binding)
。