irbはinteractive rubyの略です. rubyの式を標準入力から簡単に入力/実行する ためのツールです.
% irb
で行ないます.
irbの使い方は, Rubyさえ知っていればいたって簡単です. 基本的には irb と いうコマンドを実行するだけです. irbを実行すると, 以下のようなプロンプ トが表れてきます. 後は, rubyの式を入れて下さい. 式が完結した時点で実行 されます.
dim% irb 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.rb [options] file_name opts options: -f ~/.irbrc を読み込まない. -m bcモード(分数, 行列の計算ができる) -d $DEBUG をtrueにする(ruby -d と同じ) -Kc ruby -Kcと同じ -r load-module ruby -r と同じ. --verbose これから実行する行を表示する(デフォルト) --noverbose これから実行する行を表示しない --echo 実行結果を表示する(デフォルト) --noecho 実行結果を表示しない --inspect 結果出力にinspectを用いる(bcモード以外はデフォルト). --noinspect 結果出力にinspectを用いない. --readline readlineライブラリを利用する. --noreadline readlineライブラリを利用しない. デフォルトの動作は,
inf-reuby-mode以外でreadlineライブラリを利用しよう とする.
--prompt prompt-mode --prompt-mode prompt-mode
プロンプトモードを切替えます. 現在定義されているプ ロンプトモードは, default, simple, xmp, inf-rubyが 用意されています. デフォルトはdefaultプロンプトモー ドになっています.
--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起動時に``~/.irbrc''を読み込みます. もし存在しない場合は, ``.irbrc'', ``irb.rc'', ``_irbrc'', ``$irbrc''の順にloadを試みます.
オプションを設定する代わりに, 以下のコマンドでもデフォルトの動作を設定 できます.
IRB.conf[:IRB_NAME]="irb" IRB.conf[:MATH_MODE]=false IRB.conf[:USE_TRACER]=false IRB.conf[:USE_LOADER]=false IRB.conf[:IGNORE_SIGINT]=true IRB.conf[:IGNORE_EOF]=false IRB.conf[:INSPECT_MODE]=nil IRB.conf[:IRB_RC] = nil IRB.conf[:BACK_TRACE_LIMIT]=16 IRB.conf[:USE_LOADER] = false IRB.conf[:USE_READLINE] = nil IRB.conf[:USE_TRACER] = false IRB.conf[:IGNORE_SIGINT] = true IRB.conf[:IGNORE_EOF] = false IRB.conf[:PROMPT_MODE] = :DEFALUT IRB.conf[:PROMPT] = {...} IRB.conf[:DEBUG_LEVEL]=0 IRB.conf[:VERBOSE]=true
プロンプトをカスタマイズしたい時には,
IRB.conf[:PROMPT]
を用います. 例えば, .irbrcの中で下のような式を記述します:
IRB.conf[:PROMPT][:MY_PROMPT] = { # プロンプトモードの名前 :PROMPT_I => nil, # 通常のプロンプト :PROMPT_S => nil, # 文字列などの継続行のプロンプト :PROMPT_C => nil, # 式が継続している時のプロンプト :RETURN => " ==>%s\n" # リターン時のプロンプト }
プロンプトモードを指定したい時には,
irb --prompt my-prompt
でそのプロンプトモードで起動されます. または, .irbrcに下式を記述しても OKです.
IRB.conf[:PROMPT_MODE] = :MY_PROMPT
PROMPT_I, PROMPT_S, PROMPT_Cは, フォーマットを指定します.
%N 起動しているコマンド名が出力される. %m mainオブジェクト(self)がto_sで出力される. %M mainオブジェクト(self)がinspectされて出力される. %l 文字列中のタイプを表す(", ', /, ], `]'は%wの中の時) %NNi インデントのレベルを表す. NNは数字が入りprintfの%NNdと同じ. 省
略可能
%NNn 行番号を表します. %% %
例えば, デフォルトのプロンプトモードは:
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" }
となっています.
RETURNは, 現在のところprintf形式です. 将来仕様が変わるかも知れません.
コマンドラインオプションおよびIRB.confは(サブ)irb起動時のデフォルトの 設定を決めるもので, `5. コマンド'にあるconfで個別の(サブ)irbの設定がで きるようになっています.
IRB.conf[:IRB_RC]にprocが設定されていると, サブirbを起動する時にその procをirbのコンテキストを引数として呼び出します. これによって個別のサ ブirbごとに設定を変えることができるようになります.
irb拡張コマンドは, 簡単な名前と頭に`irb_'をつけた名前と両方定義されて います. これは, 簡単な名前がoverrideされた時のためです.
exit, quit, irb_exit
終了する. サブirbの場合, そのサブirbを終了する.
conf, irb_context
irbの現在の設定を表示する. 設定の変更は, confにメッセージを送るこ とによって行なえる.
conf.eval_history = N
実行結果のヒストリ機能の設定. nnは整数かnilで nn>0 であればその数だけヒストリにためる。nn==0の時は 無制限に記憶する、nilだとヒストリ機能はやめる(デフォルト).
Conf.back_trace_limit
バックトレース表示をバックトレースの頭からn, 後ろからnだけ行なう. デフォルトは16
conf.debug_level = N
irb用のデバッグレベルの設定
conf.ignore_eof = true/false
^Dが入力された時の動作を設定する. trueの時は^Dを無視する, falseの 時はirbを終了する.
conf.ignore_sigint= true/false
^Cが入力された時の動作を設定する. false時は, irbを終了する. trueの 時の動作は以下のようになる:
入力中: これまで入力したものをキャンセルしトップレベルに戻る. 実行中: 実行を中止する.
conf.inf_ruby_mode = true/false
inf-ruby-mode用のプロンプト表示を行なう. デフォルトはfalse.
conf.inspect_mode = true/false/nil
インスペクトモードを設定する. true: インスペクトして表示する. false: 通常のprintで表示する. nil: 通常モードであれば, inspect modeとなり, mathモードの時は, non
inspect modeとなる.
conf.math_mode
参照のみ. bcモード(分数, 行列の計算ができます)かどうか?
conf.use_loader = true/false
load/require時にirbのfile読み込み機能を用いるモードのスイッチ(デフォ ルトは用いない). このモードはIRB全体に反映される.
conf.prompt_c
ifの直後など, 行が継続している時のプロンプト.
conf.prompt_i
通常のプロンプト.
conf.prompt_s
文字列中などを表すプロンプト.
conf.rc
~/.irbrcを読み込んだかどうか?
conf.use_prompt = true/false
プロンプト表示するかどうか? デフォルトではプロンプトを表示する.
conf.use_readline = true/false/nil
readlineを使うかどうか? true: readlineを使う. false: readlineを使わない. nil: (デフォルト)inf-reuby-mode以外でreadlineライブラリを利用しよ
うとする.
cws, chws, irb_cws, irb_chws, irb_change_workspace [obj]
objをselfとする. objが省略されたときは, home workspace, すなわち irbを起動したときのmain objectをselfとする.
pushws, irb_pushws, irb_push_workspace [obj]
UNIXシェルコマンドのpushdと同様.
popws, irb_popws, irb_pop_workspace
UNIXシェルコマンドのpopdと同様.
irb [obj]
サブirbを立ちあげる. objが指定された時は, そのobjをselfとする.
jobs, irb_jobs
サブirbのリスト
fg n, irb_fg n
指定したサブirbにスイッチする. nは, 次のものを指定する.
irb番号 スレッド irbオブジェクト self(irb objで起動した時のobj)
kill n, irb_kill n
サブirbをkillする. nはfgと同じ.
souce, irb_source path
UNIXシェルコマンドのsourceと似ている. 現在の環境上でpath内のスクリ プトを評価する.
irb_load path, prev
Rubyのloadのirb版.
_
前の計算の実行結果を覚えている(ローカル変数).
___ __
実行結果の履歴を覚えている. __[line_no]で、その行で実行した結果を得ることができる. line_noが負の 時には、最新の結果から-line_no前の結果を得ることができる.
以下のような感じです.
dim% ruby irb.rb 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 # 終了 dim%
irbは, 評価できる時点(式が閉じた時点)での逐次実行を行ないます. したがっ て, rubyを直接使った時と, 若干異なる動作を行なう場合があります.
現在明らかになっている問題点を説明します.
rubyでは, 以下のプログラムはエラーになります.
eval "foo = 0" foo -- -:2: undefined local variable or method `foo' for #<Object:0x40283118> (NameError) --- NameError
ところが, irbを用いると
>> eval "foo = 0" => 0 >> foo => 0
となり, エラーを起こしません. これは, rubyが最初にスクリプト全体をコン パイルしてローカル変数を決定するからです. それに対し, irbは実行可能に なる(式が閉じる)と自動的に評価しているからです. 上記の例では,
evel "foo = 0"
を行なった時点で評価を行ない, その時点で変数が定義されるため, 次式で 変数fooは定義されているからです.
このようなrubyと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'
現在のところヒアドキュメントの実装は不完全です.
シンボルであるかどうかの判断を間違えることがあります. 具体的には式が完了 しているのに継続行と見なすことがあります.