pryを使う

WorkInProgress

# ref
- [pry/pry GitHub](https://github.com/pry/pry)
- [Rubyistよ、irbを捨ててPryを使おう - TIM Labs](http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html)
- [Pryコンソールのプロンプトをカラフルかつ便利にする](http://qiita.com/okuramasafumi/items/900286cd4f07c1bbbb5d)

# install
- 本体
  - `gem install pry`
- pry-doc
  - `gem install pry-doc`
- windowsで色の設定とか
  - `gem install pry-theme`

で、コマンドプロンプトとかで`pry`として起動すると下記のようになっていると思う

```
[1] pry(main)> 
```



# よく使ってる機能

## ls
変数とメソッドの一覧を表示
ちょっとどうだったかな？という時に便利

```ruby
# 現在のスコープの変数とメソッドの一覧
[1] pry(main)> ls
self.methods: inspect  to_s
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
```

```ruby
# 指定したオブジェクトの変数とメソッドの一覧
[2] pry(main)> ls 1
Comparable#methods: between?
Numeric#methods:
  +@     arg     conjugate  imag       phase         pretty_print_cycle  real?        remainder               to_c
  abs2   coerce  eql?       imaginary  polar         quo                 rect         singleton_method_added
  angle  conj    i          nonzero?   pretty_print  real                rectangular  step
Integer#methods:
  ceil  denominator  floor  gcdlcm    lcm   numerator  pred         round  to_i    to_r      upto
  chr   downto       gcd    integer?  next  ord        rationalize  times  to_int  truncate
Fixnum#methods:
  %  *   +  -@  <   <=   ==   >   >>  ^    bit_length  divmod  fdiv     magnitude  odd?  succ  to_s   |
  &  **  -  /   <<  <=>  ===  >=  []  abs  div         even?   inspect  modulo     size  to_f  zero?  ~
```

が、クラス名とかが青色で見にくくて色の設定を変更した
[pryでlsした際のオブジェクト名の色を変更する](http://qiita.com/k-ta-yamada/items/9f8b40dcb98be4f2ddf5)


## cd

Move into a new context (object or scope).
指定したオブジェクトの中に入る感じ

```ruby
[16] pry(main)> ls
self.methods: inspect  to_s
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_

# 1(つまりFixnum)の中に移動する
[17] pry(main)> cd 1

# 移動後のスコープはFixnumなので、lsだけで下記の結果となる
[18] pry(1):1> ls
Comparable#methods: between?
Numeric#methods:
  +@    angle  coerce  conjugate  i     imaginary  phase  pretty_print        quo   real?  rectangular  singleton_method_added  to_c
  abs2  arg    conj    eql?       imag  nonzero?   polar  pretty_print_cycle  real  rect   remainder    step
Integer#methods:
  ceil  denominator  floor  gcdlcm    lcm   numerator  pred         round  to_i    to_r      upto
  chr   downto       gcd    integer?  next  ord        rationalize  times  to_int  truncate
Fixnum#methods:
  %  *   +  -@  <   <=   ==   >   >>  ^        abs         div     even?  inspect    modulo  size  to_f  zero?  ~
  &  **  -  /   <<  <=>  ===  >=  []  __pry__  bit_length  divmod  fdiv   magnitude  odd?    succ  to_s  |
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
```


## ?
`show-source`のエイリアス（別名）
詳細は後述のpry-docの項にて


## $
`show-doc`のエイリアス（別名）
詳細は後述のpry-docの項にて

## binding.pry
デバッグに
上記のようなコマンドではなく、実行したいソースの中に仕込む
[RubyistならデバッグにはPryのbinding.pryがおすすめ](http://blog.livedoor.jp/sasata299/archives/51841232.html)



# 何がいいの？

すぐ実行して試せる点

## `#to_s`を試してみる

```ruby
[1] pry(main)> 1.to_s
=> "1"
```

## 連番付与した名称が欲しいな、とか

```ruby
[1] pry(main)> (1..10).each { |i| puts "col_name#{'%02d' % i}" }
col_name01
col_name02
col_name03
col_name04
col_name05
col_name06
col_name07
col_name08
col_name09
col_name10
=> 1..10
```

# pry-doc

[pry-docでカジュアルにRubyのソースコードを読む](http://qiita.com/joker1007/items/42f00b12c65bbec0e50a)

pryの中でソースとか使い方とか見たりする
`gem install pry-doc`

## 例：to_sのリファレンスを見る
`? 1.to_s`

```
[1] pry(main)> ? 1.to_s

From: numeric.c (C Method):
Owner: Fixnum
Visibility: public
Signature: to_s(*arg1)
Number of lines: 9

Returns a string containing the representation of fix radix base
(between 2 and 36).

   12345.to_s       #=> "12345"
   12345.to_s(2)    #=> "11000000111001"
   12345.to_s(8)    #=> "30071"
   12345.to_s(10)   #=> "12345"
   12345.to_s(16)   #=> "3039"
   12345.to_s(36)   #=> "9ix"
```

## 例：to_sのソースを見る
`$ 1.to_s`

```
[1] pry(main)> $ 1.to_s

From: numeric.c (C Method):
Owner: Fixnum
Visibility: public
Number of lines: 15

static VALUE
fix_to_s(int argc, VALUE *argv, VALUE x)
{
    int base;

    if (argc == 0) base = 10;
    else {
        VALUE b;

        rb_scan_args(argc, argv, "01", &b);
        base = NUM2INT(b);
    }

    return rb_fix2str(x, base);
}
```