В чем разница между вызовами 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
?
binding
— это специальный объект, в котором хранятся локальные переменные. При добавленииpry
к объектуbinding
эти локальные переменные становятся доступными для отладчика REPL. Обратите внимание, что есть еще один способ сделать это:Pry.start(binding)
. Методpry
на самом деле определен вObject
: см. здесь для получения дополнительной информации. - person max pleaner   schedule 21.12.2017Pry.start(binding)
эквивалентноbinding.pry
.Pry.start(binding)
кажется более понятным. Спасибо! Я до сих пор не уверен, что делает только вызовpry
. - person Francio Rodrigues   schedule 21.12.2017pry
определен для объекта, поэтому вы можете вызывать его для чего угодно:1.pry
например, хотя для этого нет причин. Когда вы вызываете его наbinding
, это делает доступными локальные переменные. - person max pleaner   schedule 21.12.2017