Ruby 3.
この記事では、型補完の追加、補完ダイアログの色変更API、デバッグに便利な機能、その他便利な機能追加について紹介します。
なお、IRBはDefault gemsのため、Ruby 3.gem update irb
やbundle add irb
でインストールすることで最新のIRBを利用できます。
動作確認環境
記事内容はRuby 3.
IRBの補完機能の強化
IRBでは、型による補完機能の強化、補完ダイアログの色変更APIの追加が行われました。
型補完の導入
今までは正規表現を使った補完を行っていました。正規表現による補完には限界があり、精度が悪い、メソッドチェーンの場合の補完が遅いなどの問題がありました。
これらの問題を解決するため、repl_
たとえばこのようなコードを書いた場合、正規表現による補完では正しく候補を絞り込みできませんでした。
irb(main):001> array = [0, 1, 2]
=> [0, 1, 2]
irb(main):002> array[0].o
|array[0].one? |
|array[0].object_id|
この例ではone?
が表示されていますがa[0]
はInteger
クラスのためa[0].one?
は呼び出せず、NoMethodError
が発生します。これは入力を正規表現で[0].o
と切り取ったときに配列に対するメソッド呼び出しに見えるためです。
repl_
を使うと正確に補完でき、呼び出せるメソッドのみが表示されています。
irb(main):001> array = [0, 1, 2]
=> [0, 1, 2]
irb(main):002> array[0].o
|array[0].object_id|
|array[0].odd? |
|array[0].ord |
さらに補完機能が強化され、ブロック引数やブロックのスコープ内でローカル変数を定義した場合の補完もできるようになりました。ローカル変数がどのようなクラスになる可能性があるかを推測して表示しています。
# ブロック引数も補完が有効
irb(main):004* array.each_with_index do |chr, i|
irb(main):005* chr.a
|chr.ascii_only?|
irb(main):004* array.each_with_index do |chr, i|
irb(main):005* i.o
|i.object_id|
|i.odd? |
|i.ord |
# ブロックスコープ内のローカル変数にも補完が有効
irb(main):004* array.each_with_index do |chr, i|
irb(main):005* str = chr.capitalize
irb(main):006* str.a
|str.ascii_only?|
また、リポジトリにsig/
ディレクトリがある場合それを読み込んで補完します。
repl_type_completorの利用方法
型補完は現在のところデフォルトではないため、repl_
repl_gem install
やbundle add
してこれらのライブラリをインストールしてください。もし依存ライブラリがない場合はメッセージを表示し、正規表現補完にフォールバックします。
repl_.irbrc
で設定する」
.irbrc
IRB.
をconf[:COMPLETOR] = :type .irbrc
に追記してください。- コマンドラインオプション
--type-completor
を付けてIRBを実行してください。- 環境変数
- 環境変数
IRB_
にCOMPLETOR type
を設定してIRBを実行してください。
型補完が有効か確認するには、IRBでirb_
を実行してください。Completion: ReplTypeCompletor
と表示されていれば型補完が使われています。
Completion: Autocomplete, ReplTypeCompletor: 0.1.2, Prism: 0.19.0, RBS: 3.4.0
補完ダイアログの色変更APIの導入
IRBは行編集エディタとしてRelineを使用しており、補完ダイアログをターミナルエミュレータに表示する機能はRelineが担っています。以前までは補完ダイアログの色を変更することはできず、Relineにハードコードされた色を使うしかなくターミナルエミュレータの設定によっては見づらい色となっていました。
この問題を解決するため、Reline v0.
.irbrc
に以下のように書くことでダイアログの色を設定できます。
Reline::Face.config(:completion_dialog) do |conf|
conf.define :default, foreground: :white, background: :blue
conf.define :enhanced, foreground: :white, background: :magenta
conf.define :scrollbar, foreground: :white, background: :blue
end
また、16進数のカラーコードでも指定できます。
Reline::Face.config(:completion_dialog) do |conf|
conf.define :default, foreground: '#000000', background: '#6495ed'
conf.define :enhanced, foreground: '#000000', background: '#00bfff'
conf.define :scrollbar, foreground: '#0000ff', background: '#87cefa'
end
このようにデフォルト、選択している行、スクロールバーごとに文字色foreground
、背景色background
を設定できます。
詳しい設定方法はドキュメント
なお、Windows Terminalを使用している場合は、Reline::
を追記してください。
ターミナルエミュレータの色表現には256色モードとTrueColorモードがあります。たとえばMacOS標準のターミナルエミュレータのTerminal.COLORTERM
環境変数によって判断していますが、Windows TerminalはCOLORTERM
環境変数が設定されていません。
そのため、Reline::
を設定することで強制的にTrueColorで表現します。
debug.gemとの連携強化
IRB v1.debug
やnext
などデバッグコマンドを入力することでdebug.
たとえば以下のようなRubyプログラムを実行します。2行目のbinding.
でプログラムの実行が止まり、IRBのセッションを開きます。
foo = 1
binding.irb
bar = 2
foo = 3
IRBが入力待ちの状態になります。
❯ ruby test.rb
From: test.rb @ line 2 :
1: foo = 1
=> 2: binding.irb
3: bar = 2
4: foo = 3
irb(main):001>
ここでdebug
コマンドなどのデバッグコマンドを入力することで、デバッガモードへ移行します。
たとえば、info local_
i l
)help
でデバッグコマンドの一覧を確認できます。
irb(main):001> debug
irb:rdbg(main):002> info local_variables
%self = main
_ = nil
foo = 1
bar = nil
以前まではデバッグモードでの複数行入力ができませんでしたが、IRB v1.
# 複数行入力
irb:rdbg(main):008* def baz
irb:rdbg(main):009* 'baz'
irb:rdbg(main):010> end
:baz
# IRBのコマンド入力
irb:rdbg(main):011> irb_info
Ruby version: 3.3.0
...
その他の機能追加
その他、いくつかの機能が追加されています。
ページャーの導入
実行結果の行数がターミナルエミュレータの高さよりも長い場合にページャーを利用するようになりました。ls
、show_
などのコマンドもページャーを利用します。利用するページャーはRI_
環境変数、PAGER
環境変数、less
、more
の順で決定します。
たとえば利用できるEncodingの一覧を表示するメソッドのEncoding.
を実行した場合、即座に103行表示されていました。
新しいIRBでは、ページャーが有効な場合はless
などが起動します。この画面を抜けるにはお使いのぺージャーに応じてq
などを入力してください。
show_source
コマンドに-s
オプションが追加
メソッドの定義位置を表示できるshow_
コマンドにsuper
を遡れるオプションが追加されました。
たとえば、以下のコードをtest.
という名前で保存し、IRBで読み込んでみましょう。
class Foo
def foo
"foo"
end
end
class Bar < Foo
def foo
super + "bar"
end
end
irb(main):001> require_relative 'test'
=> true
show_
を実行して、Bar#foo
の定義位置を知ることができます。また、super
の定義位置を知りたい場合には-s
をつけることで親クラスにさかのぼれます。定義位置をさらにさかのぼりたい場合は-ss
のようにs
の数を増やしてください。
irb(main):002> show_source Bar#foo
From: test.rb:8
def foo
super + "bar"
end
=> nil
irb(main):003> show_source Bar#foo -s
From: test.rb:2
def foo
"foo"
end
=> nil
history
コマンドの追加
history
コマンドが追加され、IRB上から入力履歴を確認できるようになりました。
irb(main):001> bar = 'bar'
=> "bar"
irb(main):002> history
1108: history
1107: bar = 'bar'
...
;
で終わるときに実行結果を出力しない
IRBではデフォルトで最後に評価した結果のinspect
を出力しますが、出力が非常に長くなってしまうことがあります。これを避けるため行末に;nil
を書くことでnil
を評価して出力しないというテクニックがありました。新しいIRBでは行末に;
をつけると出力を抑制できます。
irb(main):004> str = "foo" * 300;
irb(main):005> str.size
=> 900
まとめ
Ruby 3.