fugafuga.write

日々のログ

Ruby 2.x.x 入門 -そう、pry ならね。-

前回、Rubyの基礎を学習するために、対話型実行ツールの irb が使えるということで、
irb について調べていたところ、より洗練されて多機能であるツールがあるという情報をgetしました。

その名も pry


環境:Mac OS X 10.9.4

pry とはなんぞや

irb よりも多機能な対話型ツール。
発音は、「ぷらぁい」

対話型ツールのことをREPLというらしい。
ちなみに、pry の意味は、"覗く"とか"詮索好きな"とか、"てこ"(テコの原理)の意味がある。
pry の Git公式ドキュメントのトップ絵は確かにてこっぽい。


pry を使うとこんなことができる

  • シンタックスハイライトしてくれる。
  • パッとコード補完してくれる。
  • ドキュメントをスッとブラウズできる。
  • gemやRubyの内部のコードをサッと読める。
  • コマンドシェルでスッとエディタ起動をしたりできる。
  • Gistと連携できる。
  • デバッグができる。

…etc


Oh...さすが、pry なんでもできる。

今回は、Rubyの基礎を学ぶために使用するので上記の機能を全ては使うわけではありません。
ですが、後々活用できそうなので、使うときになったら記事を更新していこうかと思います。

さて、早速導入といきましょう。

pry を使う

§ インストール

兎にも角にもモノがないと始まりません。
インストールしましょう。

$ gem install pry pry-doc

インストールが終わったら得意技のバージョン確認です。

$ pry -v
Pry version 0.10.1 on Ruby 2.0.0

無事にインストールできました。


??
gem?
gemって何?
rvmじゃねぇの?

ggrksしました。

Wikipediaより
RubyGemsは、Ruby言語用のパッケージ管理システムであり、Rubyのプログラムと("gem" と呼ばれる)ライブラリの配布用標準フォーマットを提供している。gemを容易に管理でき、gemを配布するサーバの機能も持つ。Rubyバージョン1.9以降では標準ライブラリの一部となっている。

ほうほう。
Rubyのライブラリはgemで管理して、Ruby本体のバージョンはrvmで管理するということかな?
とりあえず、gemが何者かはわかったので違いは別途調べることとしよう。

§ 起動する

$ pry
[1] pry(main)>

きました。なんでもできるpryきました。
「俺、対話型だからなんでも言ってくれよ」といわんばかりの風格です。(適当)

§ 実行する

[1] pry(main)> puts "Hello, pry!!"
Hello, pry!!
=> nil
[2] pry(main)>

毎度おなじみ、Hello, pry。

シンタックスハイライトもやってくれています。
これだけじゃ物足りないので他の機能も見ていきましょう。

§ コード補完機能

p だけ入力して、Tabキーを押すと、

[1] pry(main)> p
p                                private_methods
pessoa-poem                      proc
play                             protected_methods
pp                               pry
pretty_inspect                   pry-backtrace
pretty_print                     pry-version
pretty_print_cycle               public
pretty_print_inspect             public_method
pretty_print_instance_variables  public_methods
print                            public_send
printf                           putc
private                          puts

サジェストしてくれます。
Linux と同じような感じですね。

§ ドキュメントを見る:?

puts のドキュメントを見てみます。

[26] pry(main)> ? puts

From: io.c (C Method):
Owner: Kernel
Visibility: private
Signature: puts(*arg1)
Number of lines: 3

Equivalent to

    $stdout.puts(obj, ...)

Alias が設定されているので、show-doc でも同じ結果になります。

§ ソースコードを見る:$

puts のソースコードを見てみましょう。

[33] pry(main)> $ puts

From: io.c (C Method):
Owner: Kernel
Visibility: private
Number of lines: 8

static VALUE
rb_f_puts(int argc, VALUE *argv, VALUE recv)
{
    if (recv == rb_stdout) {
	return rb_io_puts(argc, argv, recv);
    }
    return rb_funcall2(rb_stdout, rb_intern("puts"), argc, argv);
}

Aliasが設定されているので、show-methodshow-source でも同じ結果になります。

§ オブジェクト一覧を見る:ls、指定したオブジェクトの中に移動する:cd

hoge オブジェクトを作って、

[6] pry(main)> hoge = "hoge"
=> "hoge"

ls で現在のオブジェクト一覧が見れます。

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

cd で指定したオブジェクトに移動します。

[8] pry(main)> cd hoge
[9] pry("hoge"):1>

メソッド:prepend を実行してみます。

[10] pry("hoge"):1> prepend "fugaaaa"
=> "fugaaaahoge"
[11] pry("fugaaaahoge"):1>



§ 現在位置を調べる:@

[6] pry(main)> @
At the top level.

[34] pry("fugaaaahoge"):1> @
Inside "fugaaaahoge".

Alias が設定されているので、whereamiでも可能です。

§ 現在位置までのフレームネストを調べる:nesting

現在位置までのフレームネストがどれくらいあるのかを表示してみます。
フレームというのは、1つのWindow内にある複数の切り替え可能な画面のこと。
調べたところ、Emacsの用語からきていると思われる。

[54] pry("fugaaaahoge"):1> nesting
Nesting status:
--
0. main (Pry top level)
1. "fugaaaahoge"



§ シェルコマンドを実行する

"."を頭につけると、シェルコマンドを実行できます。

[13] pry(main)> .date
2014830日 土曜日 234717JST



§ デバッグを行う

ruby のソースコード内に

binding.pry

を書くと、書いた場所がブレークポイントとなり、
アプリケーションの実行が止まってpryが立ち上がります。

デバッグ機能を使うのはまだ先ですが、とりあえず覚えておきます。

§ pry を終了する:!!!

気合入ってるように見えますが、コマンドなんですこれ。

[4] pry(main)> !!!

Aliasが設定されているので、quitexitでも同じ結果になります。

あとがき

とりあえず、pryの基本的な操作はこれでできそうです。
helpコマンドでpryのヘルプは参照できるので、そちらも活用しながら徐々に慣れていければと。
オブジェクトの中に移動するってところがRubyらしくていいですね。



たのしいRuby 第4版

たのしいRuby 第4版

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版



(参考サイト)
File: README — Documentation for banister/pry (master)
Rubyistよ、irbを捨ててPryを使おう - TIM Labs
GNU Emacs Lispリファレンスマニュアル: 28. フレーム
【ruby】pryを使ってデバッグしよう。 - 記すに足らず。