Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library irb
library irb
要約
irb は Interactive Ruby の略です。 irb を使うと、Ruby の式を標準入力から簡単に入力・実行することができます。
irb の使い方
Ruby さえ知っていれば irb を使うのは簡単です。 irb コマンドを実行すると、以下のようなプロンプトが表れます。
$ irb irb(main):001:0>
あとは Ruby の式を入力するだけで、その式が実行され、結果が表示されます。
irb(main):001:0> 1+2 3 irb(main):002:0> class Foo irb(main):003:1> def foo irb(main):004:2> print 1 irb(main):005:2> end irb(main):006:1> end nil irb(main):007:0>
また irb コマンドは readline ライブラリにも対応しています。 readline ライブラリがインストールされている時には 自動的にコマンドライン編集や履歴の機能が使えるようになります。
irb のコマンドラインオプション
irb [options] file_name opts options: -f ~/.irbrc を読み込まない -m bc モード (分数と行列の計算ができる) -d $DEBUG を true にする (ruby -d と同じ) -Kc ruby -Kc と同じ -r library ruby -r と同じ -I ruby -I と同じ --verbose これから実行する行を表示する (デフォルト) --noverbose これから実行する行を表示しない --echo 実行結果を表示する (デフォルト) --noecho 実行結果を表示しない --inspect 結果出力にinspectを用いる (bc モード以外ではデフォルト) --noinspect 結果出力にinspectを用いない --readline readlineライブラリを利用する --noreadline readlineライブラリを利用しない。デフォルトでは inf-ruby-mode 以外で readline ライブラリを利用する。 --prompt prompt-mode --prompt-mode prompt-mode プロンプトモードを切り替える。現在定義されているプ ロンプトモードは、default/simple/xmp/inf-ruby。 --inf-ruby-mode emacsのinf-ruby-mode 用のプロンプト表示を行なう。 特に指定がない限り readline ライブラリは使わなくなる。 --simple-prompt 非常にシンプルなプロンプトを用いるモード。 --noprompt プロンプトを表示しない。 --tracer コマンド実行時にトレースする。 --back-trace-limit n バックトレース表示をバックトレースの頭から n、 うしろから n だけ行なう。デフォルト値は 16。 --irb_debug n irb のデバッグレベルを n に設定する (ユーザは利用すべきではない) -v, --version irb のバージョンを表示する
irb のカスタマイズ
irb コマンドは起動時にホームディレクトリの .irbrc というファイルを読み込みます。 .irbrc は Ruby スクリプトです。ホームディレクトリに .irbrc が存在しない場合は、 カレントディレクトリの .irbrc, irb.rc, _irbrc, $irbrc を順番にロードしようと 試みます。
以下のような (Ruby の) 式を .irbrc に記述すると、 irb コマンドのオプションを指定したのと同じ効果が得られます。
IRB.conf[:AUTO_INDENT] = false IRB.conf[:BACK_TRACE_LIMIT] = 16 IRB.conf[:DEBUG_LEVEL] = 1 IRB.conf[:ECHO] = nil IRB.conf[:EVAL_HISTORY] = nil IRB.conf[:HISTORY_FILE] = nil IRB.conf[:IGNORE_EOF] = true IRB.conf[:IGNORE_SIGINT] = true IRB.conf[:INSPECT_MODE] = nil IRB.conf[:IRB_NAME] = "irb" IRB.conf[:IRB_RC] = nil IRB.conf[:MATH_MODE] = false IRB.conf[:PROMPT] = {....} IRB.conf[:PROMPT_MODE] = :DEFALUT IRB.conf[:SINGLE_IRB] = false IRB.conf[:SAVE_HISTORY] = nil IRB.conf[:USE_LOADER] = true IRB.conf[:USE_READLINE] = nil IRB.conf[:USE_TRACER] = true IRB.conf[:VERBOSE] = true
プロンプトのカスタマイズ
irb のプロンプトをカスタマイズしたい時は、 まず独自のプロンプトモードを作成し、 それをコマンドラインや .irbrc に指定します。
まず、新しいプロンプトモードを作成するには、 例えば .irbrc で以下のように記述します。
# 新しいプロンプトモード MY_PROMPT を作成する IRB.conf[:PROMPT][:MY_PROMPT] = { :PROMPT_I => nil, # 通常時のプロンプト :PROMPT_S => nil, # 文字列などの継続行のプロンプト :PROMPT_C => nil, # 式が継続している時のプロンプト :RETURN => " ==>%s\n" # メソッドから戻る時のプロンプト }
いま作成した新しいプロンプトモードを使うには、 以下のように irb コマンドに --prompt オプションを指定します。
$ irb --prompt my-prompt
毎回指定するのが面倒なら、.irbrc に以下の式を記述します。
# プロンプトモード MY_PROMPT を使う IRB.conf[:PROMPT_MODE] = :MY_PROMPT
PROMPT_I, PROMPT_S, PROMPT_C にはフォーマット文字列を指定します。 フォーマット文字列では Kernel.#printf のように 「%」を用いた記法が使えます。 フォーマット文字列で使用可能な記法は以下の通りです。
- %N
-
起動しているコマンド名
- %m
-
main オブジェクト (self) を to_s した文字列
- %M
-
main オブジェクト (self) を inspect した文字列
- %l
-
文字列中のタイプを表す (", ', /, ], `]'は%wの中の時)
- %NNi
-
インデントのレベルを、NN 桁に右詰めした文字列。 NN は省略可能。
- %NNn
-
行番号を、NN 桁に右詰めした文字列。 NN は省略可能。
- %%
-
文字「%」それ自体
また、RETURN は現在のところ printf と全く同じ形式で指定します。 ただし、将来は仕様が変わる可能性があります。
例えば、デフォルトのプロンプトモードである 「default」プロンプトモードは以下のように設定されています。
IRB.conf[:PROMPT_MODE][:DEFAULT] = { :PROMPT_I => "%N(%m):%03n:%i> ", :PROMPT_S => "%N(%m):%03n:%i%l ", :PROMPT_C => "%N(%m):%03n:%i* ", :RETURN => "%s\n" }
プロンプトモードは :DEFAULT の他に :NULL, :CLASSIC, :SIMPLE, :XMP が定義されています。
サブ irb
irb では、起動時の irb インタプリタとは独立した環境を持つ 「サブ irb」を任意の数だけ起動することができます。 サブ irb は、irb 実行中に「irb」と入力すると起動します。
例えば以下の実行例を見てください。
irb(main):004:0> x = "OK" # ローカル変数 x を定義 => "OK" irb(main):005:0> x # x を表示 => "OK" irb(main):006:0> irb # サブ irb を起動 irb#1(main):001:0> x # x を表示 NameError: undefined local variable or method `x' for main:Object from (irb#1):1:in `Kernel#binding'
起動時のインタプリタでローカル変数 x を定義しましたが、 「irb」でサブ irb を起動すると、 ローカル変数 x が見えなくなっています。 これが「独立した環境」の意味です。
サブ irb の設定
irb コマンド起動時のインタプリタの設定は コマンドラインオプションと IRB.conf の値で決まります。 それに対して、サブ irb インタプリタの設定は、 各インタプリタの「conf」オブジェクトの値で決まります。
conf オブジェクトの値を変更するには、 まず以下のようにサブ irb を起動してから conf オブジェクトの 値を一つ一つ変更する方法があります。
$ irb irb(main):001:0> irb # サブ irb を起動 irb#1(main):001:0> conf.prompt_i # prompt_i の値を確認 => "%N(%m):%03n:%i> " irb#1(main):002:0> conf.prompt_i = ">" # prompt_i の値を変更 => ">" > # プロンプトが変わった
しかし、サブ irb を起動するたびに設定を入力するのは面倒です。 そこで、IRB.conf[:IRB_RC] を使う方法を紹介します。
IRB.conf[:IRB_RC] に Proc オブジェクトを設定しておくと、 サブ irb が起動されるたびに、その Proc オブジェクトに IRB::Context オブジェクトを渡して実行します。 これによってサブ irb の設定をまとめて設定することができます。
以下に例を示します。
$ irb irb(main):001:0> IRB.conf[:IRB_RC] = lambda {|conf| conf.prompt_i = "> " } => #<Proc:0x00002a95fa3fd8@(irb):2> irb(main):002:0> irb >
irb の使用例
irb のいろいろな使用例を以下に示します。
$ irb irb(main):001:0> irb # サブirbの立ちあげ irb#1(main):001:0> jobs # サブirbのリスト #0->irb on main (#<Thread:0x400fb7e4> : stop) #1->irb#1 on main (#<Thread:0x40125d64> : running) nil irb#1(main):002:0> fg 0 # jobのスイッチ nil irb(main):002:0> class Foo;end nil irb(main):003:0> irb Foo # Fooをコンテキストしてirb # 立ちあげ irb#2(Foo):001:0> def foo # Foo#fooの定義 irb#2(Foo):002:1> print 1 irb#2(Foo):003:1> end nil irb#2(Foo):004:0> fg 0 # jobをスイッチ nil irb(main):004:0> jobs # jobのリスト #0->irb on main (#<Thread:0x400fb7e4> : running) #1->irb#1 on main (#<Thread:0x40125d64> : stop) #2->irb#2 on Foo (#<Thread:0x4011d54c> : stop) nil irb(main):005:0> Foo.instance_methods # Foo#fooがちゃんと定義さ # れている ["foo"] irb(main):006:0> fg 2 # jobをスイッチ nil irb#2(Foo):005:0> def bar # Foo#barを定義 irb#2(Foo):006:1> print "bar" irb#2(Foo):007:1> end nil irb#2(Foo):010:0> Foo.instance_methods ["bar", "foo"] irb#2(Foo):011:0> fg 0 nil irb(main):007:0> f = Foo.new #<Foo:0x4010af3c> irb(main):008:0> irb f # Fooのインスタンスでirbを # 立ちあげる. irb#3(#<Foo:0x4010af3c>):001:0> jobs #0->irb on main (#<Thread:0x400fb7e4> : stop) #1->irb#1 on main (#<Thread:0x40125d64> : stop) #2->irb#2 on Foo (#<Thread:0x4011d54c> : stop) #3->irb#3 on #<Foo:0x4010af3c> (#<Thread:0x4010a1e0> : running) nil irb#3(#<Foo:0x4010af3c>):002:0> foo # f.fooの実行 nil irb#3(#<Foo:0x4010af3c>):003:0> bar # f.barの実行 barnil irb#3(#<Foo:0x4010af3c>):004:0> kill 1, 2, 3# jobのkill nil irb(main):009:0> jobs #0->irb on main (#<Thread:0x400fb7e4> : running) nil irb(main):010:0> exit # 終了 $
使用上の制限
irbは, 評価できる時点(式が閉じた時点)での逐次実行を行ないます. したがって, rubyを直接使った時と若干異なる動作を行なう場合があります.
現在明らかになっている問題点を説明します.
ローカル変数の宣言
Ruby では以下のプログラムはエラーになります.
eval "foo = 0" p foo # -:2: undefined local variable or method `foo' for #<Object:0x40283118> (NameError)
ところが irb を用いると、以下のように、エラーになりません。
>> eval "foo = 0" => 0 >> foo => 0
この違いは、Ruby と irb のプログラムのコンパイル方法の差に起因します。 Ruby は最初にスクリプト全体をコンパイルしてローカル変数を決定します。 それに対し、irb は式が完結して実行可能になった時点で順番にコンパイルします。 上記の例では、
evel "foo = 0"
が入力された時点でまずその式をコンパイル・実行します。 この時点で変数 foo が定義されるため、 次の式を入力する時点ですでに変数 foo が定義されているのです。
この Ruby と irb の動作の違いをなくしたい場合は、 irb では以下のように式を begin 〜 end でくくって入力してください。
>> begin ?> eval "foo = 0" >> foo >> end NameError: undefined local variable or method `foo' for #<Object:0x4013d0f0> (irb):3 (irb_local_binding):1:in `eval'
ヒアドキュメント
現在のところヒアドキュメントの実装は不完全です。
シンボル
irb はシンボルであるかどうかの判断を間違えることがあります。 具体的には、式が完了しているのに継続行と見なすことがあります。
クラスとモジュール
class IRB::Context | |
class IrbCommands | このクラスは irb のコマンドをまとめるためのプレースホルダです。 実際には IrbCommands というクラスは定義されていません。 このクラスのドキュメントに記述されているメソッドは、 irb のプロンプトでレシーバなしで使うことができます。 |
サブライブラリ
irb/completion | irb の completion 機能を提供するものです. |
irb/frame | |
irb/xmp | コードとその実行結果を、行ごとに交互に表示するためのライブラリです。 irb を実行しなくても、使うことが出来ます。 ごとけん xmp ([ruby-list:8489])の上位互換バージョンです. ただ, 非常に重いのでごとけん xmp では対応できない時に使用すると良いでしょう. |