irbを使ってみる

1.irbを使う

ちょっと動作を確認するのにAptana Studioをいちいち起動するのはどうなのよと思ってirbを使ってみた。

C:\ruby>irb -Ks
irb(main):001:0> "ほげ"
=> "ほげ"

最初にはまったところ。"ほげ"を打つのに、""を先に打ってから←キーで戻って、ほげと打ったら確定した時点で" ル ー ル ー"に文字化け。-Ksがまずいのかと思って-Kuとか-Keも試すなど余計なことをしていまった。ちなみに文字化けしててもそのままEnterキーを押すとちゃんと"ほげ"と表示され、↑キーで履歴を表示させると"ほげ"になってる。
irbの中のエディットで日本語を使う場合、基本的に←キーは使っちゃダメということかな。"ほげ"を"ほ3げ"にしようとして、←キーで「ほ」と「げ」の間にカーソルを移動して3を打つと"ほ 3ー"になってしまうし、"ほげ"の「ほ」だけ削除しようとして←キーで「ほ」の上にカーソルをもってってDELを押すと「ほ」が消えて" げ"になるけど、この半角スペースに見える部分もDELしないとちゃんと"げ"にならない。
Rubyの文法を確認する用途だと日本語はあまり用がないからこれで十分だけどね。

2.irbの少し高度な使い方

ここ(→プログラミング言語 Ruby リファレンスマニュアル)を見てサブirb起動をやってみた。

C:\ruby>irb -Ks
irb(main):001:0> irb
irb#1(main):001:0> jobs
=> #0->irb on main (#<Thread:0x294c74c>: stop)
#1->irb#1 on main (#<Thread:0x2e57e58>: running)

サブirb#1が起動してサブ上で現在動いているスレッドを確認。メインirb#0が止まってサブirb#1が動いているのがわかる。

irb#1(main):002:0> fg 0
=> #<IRB::Irb: @scanner=#<RubyLex:0x2e65814>, @signal_status=:IN_EVAL, @context=
#<IRB::Context:0x2e65b70>>
irb(main):002:0> class Foo;end
=> nil
irb(main):003:0> irb Foo
irb#2(Foo):001:0> def foo
irb#2(Foo):002:1>   print 1
irb#2(Foo):003:1> end
=> nil
irb#2(Foo):005:0> def bar
irb#2(Foo):006:1>   print "bar"
irb#2(Foo):007:1> end
=> nil

メインirb#0へ戻ってクラスFooを定義してサブirb#2をFooをselfにして起動。確かに「irb#2(Foo)」になってますね。サブirb#2でクラスfooとbarを定義。

irb#2(Foo):011:0> fg 0
=> #<IRB::Irb: @scanner=#<RubyLex:0x2e65814>, @signal_status=:IN_EVAL, @context=
#<IRB::Context:0x2e65b70>>
irb(main):007:0> f = Foo.new
=> #<Foo:0x2e30ed4>
irb(main):009:0> irb f
irb#3(#<Foo:0x2e30ed4>):001:0> jobs
=> #0->irb on main (#<Thread:0x294c74c>: stop)
#1->irb#1 on main (#<Thread:0x2e57e58>: stop)
#2->irb#2 on Foo (#<Thread:0x2e4d958>: stop)
#3->irb#3 on #<Foo:0x2e30ed4> (#<Thread:0x2e2db58>: running)

メインirb#0へ戻ってクラスFooのインスタンスfを作ってサブirb#3をfをselfにして起動。インスタンスがselfだから「#3->irb#3 on #」という風になっているんですね。

irb#3(#<Foo:0x2e30ed4>):002:0> foo
1=> nil
irb#3(#<Foo:0x2e30ed4>):003:0> bar
bar=> nil
irb#3(#<Foo:0x2e30ed4>):004:0> kill 1,2,3
=> #<IRB::Irb: @scanner=#<RubyLex:0x2e65814>, @signal_status=:IN_EVAL, @context=
#<IRB::Context:0x2e65b70>>
irb(main):010:0> jobs
=> #0->irb on main (#<Thread:0x294c74c>: running)
irb(main):011:0> exit

Fooのインスタンスfではサブirb#2で定義したfooやbarが使えてます。スレッド1,2,3をkillして(自分自身もkillできるんだ)、メインスレッドに戻ってきておしまい。
※ killはどこで実行するかをちゃんと考えないと変なことになります。サブirb#3で kill 1,2とやると、#3がrunningのまま#0もrunningになってしまうので、2つのスレッドで入力を取り合ってしまいます。fg 0して#0に戻ってからkillするのが間違いないかな。