summaryrefslogtreecommitdiff
path: root/doc/irb/irb.rd.ja
blob: bf8ac5d51771077ee311bfc3c327e5008e007265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
irb -- interactive ruby
				$Release Version: 0.9 $
			   	$Revision$
			   	$Date$
			   	by Keiju ISHITSUKA(keiju@ishitsuka.com)
=begin
= irbとは?

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-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[: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の設定

コマンドラインオプションおよび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-ruby-mode以外でreadlineライブラリを利用しよ
         うとする.  
#
#--- conf.verbose=T/F
#    irbからいろいろなメッセージを出力するか?

--- 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'

== ヒアドキュメント

現在のところヒアドキュメントの実装は不完全です. 

== シンボル

シンボルであるかどうかの判断を間違えることがあります. 具体的には式が完了
しているのに継続行と見なすことがあります.

=end

% Begin Emacs Environment
% Local Variables:
% mode: text
% comment-column: 0
% comment-start: "%"
% comment-end: "\n"
% End:
%