2017-12-21 5 views
1

prybinding.pryを呼び出す違いは何ですか?たとえば:`binding.pry`と` 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は、インスタンス変数とメソッドにアクセスできますが、lotrにはNameError: undefined local variableがスローされます。

どちらも同じコンテキストを示します。ここで何が起こっているのですか? binding.pryを超えるpryを呼び出すことが望ましいケースはありますか?

+1

'binding'はローカル変数が格納される特別なオブジェクトです。 'binding'オブジェクトに' pry'をパッチすることによって、これらのローカル変数はデバッガREPLに利用可能になります。もう一つのやり方があります: 'Pry.start(binding)'。 'pry'メソッドは実際には' Object'で定義されています。詳細については、[here](http://www.rubydoc.info/github/pry/pry/Object)を参照してください。 –

+0

私はそれをテストしています。 'Pry.start (binding) 'は' binding.pry'と同じです。 'Pry.start(binding)'はもっと自明のようです。ありがとう!私はまだ「呼び出す」だけでは何をしているのか分からない。 –

+0

'pry'メソッドはObject上で定義されているので、何かで呼び出すことができます:' '1.pry'などですが、これを行う理由はありません。 'binding'でそれを呼び出すと、ローカル変数が利用可能になります。 –

答えて

1

私がコメントで言ったことを反復しています。

メソッドのソース(http://www.rubydoc.info/github/pry/pry/Object)を見ると、基本的にはそれを呼び出すことができることを意味するObjectにパッチが適用されます。あなたが何を呼んでも、それに続くREPLの値はselfになります。 pryself.pry、およびPry.start(self)はすべて同じことを行います。

bindingは、特定の場所で「コンテキスト」をキャプチャし、他の場所からそれらのローカル変数にアクセスできるようにする、魔法のような複雑なものです。 binding.pryまたはPry.start(binding)を使用すると、ローカル変数がREPLの範囲内にあることが保証されます(どのように正確に言えませんか)。

また、他の場所でローカル変数を参照する他の場所では、bindingが使用されています。たとえば、ERBの文字列を評価するには、ERB.new(string).result(binding)を使用します。

+0

ありがとうございました。この[記事](http://kyrylo.hatenablog.com/entry/2013/05/29/so-what-is-binding-pry-exactly#top-level-footnote)には、主題 –

関連する問題