Author: Keiju ISHITSUKA
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 と同じ. -I ruby -I と同じ. ((<ruby 1.8.2 feature>)) --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が 用意されています. デフォルトは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[: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 ((<ruby 1.9 feature>)) IRB.conf[:IGNORE_EOF] = false IRB.conf[:IGNORE_EOF]=false IRB.conf[:IGNORE_SIGINT] = 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 ((<ruby 1.9 feature>)) IRB.conf[:USE_LOADER] = false IRB.conf[:USE_LOADER]=false IRB.conf[:USE_READLINE] = nil IRB.conf[:USE_TRACER] = false IRB.conf[:USE_TRACER]=false 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" }
となっています. :DEFAULT の他に、:NULL, :CLASSIC, :SIMPLE, :XMP が定義されています。 [ruby-src:lib/irb/init.rb]
RETURNは, 現在のところprintf形式です. 将来仕様が変わるかも知れません.
コマンドラインオプションおよび IRB.conf
は(サブ)irb起動時のデフォルトの
設定を決めるもので, irb.rb/コマンド にある 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-ruby-mode以外でreadlineライブラリを利用しよ
うとする.
cws([obj])
chws([obj])
irb_cws([obj])
irb_chws([obj])
irb_change_workspace([obj])
objをselfとする. objが省略されたときは, home workspace, すなわち irbを起動したときのmain objectをselfとする.
pushws([obj])
irb_pushws([obj])
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 path
irb_source path
UNIXシェルコマンドのsourceと似ている. 現在の環境上でpath内のスクリ プトを評価する.
irb_load path, prev
Rubyのloadのirb版.
_
前の計算の実行結果を覚えている(ローカル変数).
$ irb irb(main):001:0> 10 => 10 irb(main):002:0> 2**32 => 4294967296 irb(main):003:0> _ => 4294967296 irb(main):004:0> _ - 2**31 => 2147483648 irb(main):005:0>
__
実行結果の履歴を覚えている. __[line_no] で、その行で実行した結果を得ることができる. line_no が負の 時には、最新の結果から -line_no 前の結果を得ることができる.
デフォルトでは使えません。 使用するには、IRB.conf[:EVAL_HISTORY] = 100 などと ~/.irbrc で 設定しておく必要があります。
$ irb irb(main):001:0> conf.eval_history = 100 => 100 irb(main):002:0> 1 + 2 => 3 irb(main):003:0> 'hoge' + 'foo' => "hogefoo" irb(main):004:0> __[2] => 3 irb(main):005:0> __[3] => "hogefoo" irb(main):006:0> __[-1] => "hogefoo" irb(main):007:0>
設定ファイルに
IRB.conf[:SAVE_HISTORY] = 100
などと書いておくとヒストリーファイルにコマンドの履歴が記録されます。ヒストリーファイルはデフォルトでは ~/.irb_history です。ヒストリーファイルは IRB.conf[:HISTORY_FILE] で設定することができます。
以下のような感じです.
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'
現在のところヒアドキュメントの実装は不完全です.
シンボルであるかどうかの判断を間違えることがあります. 具体的には式が完了 しているのに継続行と見なすことがあります.
ごとけんxmpの上位互換バージョンです. ただ, 非常に重いのでごとけんxmpで は対応できない時に, 使用すると良いでしょう.
require "irb/xmp" xmp <<END foo = 1 foo END --- foo = 1 ==>1 foo ==>1
この場合は, XMPがコンテキスト情報を持つので, 変数の値などを保持してい ます.
require "irb/xmp" xmp = XMP.new xmp.puts <<END foo = 1 foo END xmp.puts <<END foo END === foo = 1 ==>1 foo ==>1 foo ==>1
XMPメソッド群のコンテキストは, 呼び出す前のコンテキストで評価されます. 明示的にコンテキストを指定するとそのコンテキストで評価します.
例:
xmp "foo", an_binding
マルチスレッドには対応していません.
現在実行中のフレーム情報を取り扱うためのクラスです.
set_trace_funcを用いてRubyの実行をトレースしています. マルチスレッドに は対応していません.
irbのcompletion機能を提供するものです.
% irb -r irb/completion
とするか, ~/.irbrc 中に
require "irb/completion"
を入れてください. irb実行中に require "irb/completion" してもよいです.
irb実行中に (TAB) を押すとコンプレーションします.
トップレベルで(TAB)を押すとすべての構文要素, クラス, メソッドの候補がで ます. 候補が唯一ならば完全に補完します.
irb(main):001:0> in in inspect instance_eval include install_alias_method instance_of? initialize install_aliases instance_variables irb(main):001:0> inspect "main" irb(main):002:0> foo = Object.new #<Object:0x4027146c> ((|変数名.|))の後に(TAB)を押すと, そのオブジェクトのメソッド一覧がでま す. irb(main):003:0> foo. foo.== foo.frozen? foo.protected_methods foo.=== foo.hash foo.public_methods foo.=~ foo.id foo.respond_to? foo.__id__ foo.inspect foo.send foo.__send__ foo.instance_eval foo.singleton_methods foo.class foo.instance_of? foo.taint foo.clone foo.instance_variables foo.tainted? foo.display foo.is_a? foo.to_a foo.dup foo.kind_of? foo.to_s foo.eql? foo.method foo.type foo.equal? foo.methods foo.untaint foo.extend foo.nil? foo.freeze foo.private_methods
*1 1.8.2 に入っていない理由は [ruby-dev:25595] を参照してください。