2015-03-07 21:06

pryの使い方

pryとは

irbの強化版

pryのGitHubページ

irbの強化版ということですからirbと比較してみましょう。

まずはirbから見ていきます。

rubyがインストールされていれば使えると思います。

terminal.app
$ irb
irb(main):001:0> 1 + 2
=> 3
irb(main):002:0> int = (1..10).map { |i| i }
=> [1, 2, 3, 4, 5, 6, 7, 8. 9, 10]
irb(main):003:0> int.methods
=> [:inspect, :to_s, :to_a, :to_h, :to_ary, :frozen?, :==, :eql?, :hash, :[], :[]=, :at, :fetch, :first, :last, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each, :each_index, :reverse_each, :length, :size, :empty?, :find_index, :index, :rindex, :join, :reverse, :reverse!, :rotate, :rotate!, :sort, :sort!, :sort_by!, :collect, :collect!, :map, :map!, :select, :select!, :keep_if, :values_at, :delete, :delete_at, :delete_if, :reject, :reject!, :zip, :transpose, :replace, :clear, :fill, :include?, :<=>, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!, :count, :shuffle!, :shuffle, :sample, :cycle, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :take, :take_while, :drop, :drop_while, :bsearch, :pack, :entries, :sort_by, :grep, :find, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :lazy, :nil?, :===, :=~, :!~, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :singleton_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]

irbはインタラクティブに、そして手軽にコードを実行するのに便利なのですが、上の例のように配列の結果などが1行で返ってきてしまうのでとても見づらい。

ではpryをば。

まず、インストールしておきます。

インストールするのはpryとpry-byebugです。

terminal.app
$ gem install pry
Fetching: coderay-1.1.0.gem (100%)
Successfully installed coderay-1.1.0
Fetching: slop-3.6.0.gem (100%)
Successfully installed slop-3.6.0
Fetching: method_source-0.8.2.gem (100%)
Successfully installed method_source-0.8.2
Fetching: pry-0.10.1.gem (100%)
Successfully installed pry-0.10.1
invalid options: -SNw2
(invalid options are ignored)
Parsing documentation for coderay-1.1.0
Installing ri documentation for coderay-1.1.0
Parsing documentation for method_source-0.8.2
Installing ri documentation for method_source-0.8.2
Parsing documentation for pry-0.10.1
Installing ri documentation for pry-0.10.1
Parsing documentation for slop-3.6.0
Installing ri documentation for slop-3.6.0
Done installing documentation for coderay, method_source, pry, slop after 10 seconds
4 gems installed
$ gem install pry-byebug
Fetching: debugger-linecache-1.2.0.gem (100%)
Successfully installed debugger-linecache-1.2.0
Fetching: columnize-0.9.0.gem (100%)
Successfully installed columnize-0.9.0
Fetching: byebug-3.5.1.gem (100%)
Building native extensions.  This could take a while...
Successfully installed byebug-3.5.1
Fetching: pry-byebug-3.0.1.gem (100%)
Successfully installed pry-byebug-3.0.1
Parsing documentation for byebug-3.5.1
Installing ri documentation for byebug-3.5.1
Parsing documentation for columnize-0.9.0
Installing ri documentation for columnize-0.9.0
Parsing documentation for debugger-linecache-1.2.0
Installing ri documentation for debugger-linecache-1.2.0
Parsing documentation for pry-byebug-3.0.1
Installing ri documentation for pry-byebug-3.0.1
Done installing documentation for byebug, columnize, debugger-linecache, pry-byebug after 10 seconds
4 gems installed

インストールが済んだら、irbの例と同じことをやってみます。

念の為、terminal.appを再起動しておきましょう。

terminal.app
$ pry
[1] pry(main)> 1 + 2
=> 3
[2] pry(main)> int = (1..10).map { |i| i }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[3] pry(main)> int.methods
=> [:inspect,
 :to_s,
 :to_a,
 :to_h,
 :to_ary,
 :frozen?,
 :==,
 :eql?,
 :hash,
 :[],
 :[]=,
 :at,
 :fetch,
 :first,
 :last,
 :concat,
 :<<,
 :push,
 :pop,
 :shift,
 :unshift,
 :insert,
 :each,
 :each_index,
 :reverse_each,
 :length,
 :size,
:

まず、配列の結果が長い場合に値を1行ずつ出力してくれているのがわかると思います。

さらに、結果が1画面に収まらない場合はUnixコマンドのlessのような感じで、1画面ずつ表示してくれます。

また、この例では表現できていませんが、実際にterminal.appではコードやその結果が綺麗にカラーリングされています。

pryでデバッグ

pryにはデバッグを行う為の仕組みが用意されています。

pryを使ってデバッグを行ってみます。

まず、デバッグを行うスクリプトを作成しておきましょう。

debug.rb
1     # -*- coding: utf-8 -*-
2
3     require 'pry'
4     require 'pry-byebug'
5
6     san = "third"
7
8     puts "first"
9     binding.pry
10   puts "second"
11   puts san
12   puts "fourth"

9目にbinding.pryというコードがあります。

まずはこのスクリプトを実行してみましょう。

terminal.app
$ ruby debug.rb
first

From:  /Users/debug.rb @ line 10 :

          5:
          6:  san = "third"
          7:
          8:  puts "first"
          9:  binding.pry
 =>  10:  puts "second"
        11:  puts san
        12:  puts "fourth"

[1] pry(main)>

スクリプト実行直後にdebug.rbの7行目のputsの結果としてfirstを表示した後、debug.rbの10行目前後のスクリプトが表示され、さらにpryが起動しています。

また、よく見てみると10行目のところが=>でマークされています。

これは、binding.pryを記述した9行目がブレークポイントとなってスクリプトが中断していることを示しています。

そして起動したpryに指示を与えることで続けてデバッグを行うことができます。

使用できる主なコマンドは次の通りです。

コマンド 解説
step 処理の中身を追います
next 次の処理に進みます
continue 次のブレークポイントまでスクリプトの実行を再開します
ls 現在のポイントにおいて、これまで定義されているメソッドや変数の一覧を表示します
cd cdの後に続ける変数などの中身に現在のポイントを移します

いくつか試してみます。

先程の続きから記述します。

terminal.app
        
        
[1] pry(main)> ls
self.methods: inspect  to_s
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_  san
[2] pry(main)> cd san
[3] pry("third"):1> ls
Comparable#methods: <  <=  >  >=  between?
String#methods: 
  %    []           capitalize!  chr         downcase        encode          gsub      intern   next!      rindex      setbyte      squeeze!     sum        to_str  upcase!        
  *    []=          casecmp      clear       downcase!       encode!         gsub!     length   oct        rjust       shellescape  start_with?  swapcase   to_sym  upto           
  +    ascii_only?  center       codepoints  dump            encoding        hash      lines    ord        rpartition  shellsplit   strip        swapcase!  tr      valid_encoding?
  <<   b            chars        concat      each_byte       end_with?       hex       ljust    partition  rstrip      size         strip!       to_c       tr!   
  <=>  bytes        chomp        count       each_char       eql?            include?  lstrip   prepend    rstrip!     slice        sub          to_f       tr_s  
  ==   bytesize     chomp!       crypt       each_codepoint  force_encoding  index     lstrip!  replace    scan        slice!       sub!         to_i       tr_s! 
  ===  byteslice    chop         delete      each_line       freeze          insert    match    reverse    scrub       split        succ         to_r       unpack
  =~   capitalize   chop!        delete!     empty?          getbyte         inspect   next     reverse!   scrub!      squeeze      succ!        to_s       upcase
self.methods: __pry__
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
[4] pry("third"):1> to_sym
=> :third
[5] pry("third"):1> gsub!("thi", "3")
=> "3rd"
[6] pry("3rd")> exit
=> "3rd"
[7] pry(main)> step
second

From: /Users/debug.rb @ line 11 :

          6: san = "third"
          7: 
          8: puts "first"
          9: binding.pry
        10: puts "second"
 =>  11: puts san
        12: puts "fourth"

[8] pry(main)> step
3rd

From: /Users/debug.rb @ line 12 :

          7: 
          8: puts "first"
          9: binding.pry
        10: puts "second"
        11: puts san
 =>  12: puts "fourth"

[9] pry(main)> continue
fourth
$ 

実際はもう少し見やすく表示してくれます。

途中でcdで変数sanの中に移動して格納している文字列を変更しています。

ここでは試しませんでしたが、変数名などを叩くとその中身を表示してくれたりもします。

これでRubyでもIDEを使わずにコンソールでデバッグが行えますね。