Ruby 3.3リリース! 新機能解説

IRBのアップデート
補完とデバッグ機能の強化

Ruby 3.3にはRubyのREPLであるIRB v1.11.0が同梱されました。新しいIRBでは補完機能やdebug.gemとの連携が強化されました。

この記事では、型補完の追加、補完ダイアログの色変更API、デバッグに便利な機能、その他便利な機能追加について紹介します。

なお、IRBはDefault gemsのため、Ruby 3.3.0以外のバージョン[1]でもgem update irbbundle add irbでインストールすることで最新のIRBを利用できます。

動作確認環境

記事内容はRuby 3.3.0、IRB v1.11.1、Reline v0.4.1、repl_type_completor v0.1.2で動作確認しています。

IRBの補完機能の強化

IRBでは、型による補完機能の強化、補完ダイアログの色変更APIの追加が行われました。

型補完の導入

今までは正規表現を使った補完を行っていました。正規表現による補完には限界があり、精度が悪い、メソッドチェーンの場合の補完が遅いなどの問題がありました。

これらの問題を解決するため、repl_type_completor gemを使って型を使った補完ができるようになりました。

たとえばこのようなコードを書いた場合、正規表現による補完では正しく候補を絞り込みできませんでした。

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_type_completorを使うと正確に補完でき、呼び出せるメソッドのみが表示されています。

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_type_completorを利用するには設定を行い、場合によってはいくつかのgemのインストールが必要です。

repl_type_completorはRuby 3.3からバンドルされたパーサのPrism、型情報のパースや解析を行うRBSに依存しています。いずれもDefault gemsのため、Ruby 3.3を使っている場合はインストール不要です。Ruby 3.2以下のバージョンの場合はgem installbundle addしてこれらのライブラリをインストールしてください。もし依存ライブラリがない場合はメッセージを表示し、正規表現補完にフォールバックします。

repl_type_completorを導入するには、.irbrcで設定する」⁠コマンドラインオプション」⁠環境変数を設定する」のうちいずれかの方法で可能です。

.irbrc
IRB.conf[:COMPLETOR] = :type.irbrcに追記してください。
コマンドラインオプション
--type-completorを付けてIRBを実行してください。
環境変数
環境変数IRB_COMPLETORtypeを設定してIRBを実行してください。

型補完が有効か確認するには、IRBでirb_infoを実行してください。Completion: ReplTypeCompletorと表示されていれば型補完が使われています。

Completion: Autocomplete, ReplTypeCompletor: 0.1.2, Prism: 0.19.0, RBS: 3.4.0

補完ダイアログの色変更APIの導入

IRBは行編集エディタとしてRelineを使用しており、補完ダイアログをターミナルエミュレータに表示する機能はRelineが担っています。以前までは補完ダイアログの色を変更することはできず、Relineにハードコードされた色を使うしかなくターミナルエミュレータの設定によっては見づらい色となっていました。

この問題を解決するため、Reline v0.4.0で補完ダイアログの色変更APIが導入されました。

.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を設定できます。

図1 default、enhanced、scrollbarの説明
図1

詳しい設定方法はドキュメントdoc/reline/face.mdを参照してください。

なお、Windows Terminalを使用している場合は、Reline::Face.force_truecolorを追記してください。

ターミナルエミュレータの色表現には256色モードとTrueColorモードがあります。たとえばMacOS標準のターミナルエミュレータのTerminal.appは256色のみ表現できるため、Relineは16進数カラーコードで指定された場合は近い色にフォールバックします。ターミナルエミュレータがどの色表現を利用できるかはCOLORTERM環境変数によって判断していますが、Windows TerminalはCOLORTERM環境変数が設定されていません。

そのため、Reline::Face.force_truecolorを設定することで強制的にTrueColorで表現します。

debug.gemとの連携強化

IRB v1.6.0以降では、debugnextなどデバッグコマンドを入力することでdebug.gemを使うことができます。

たとえば以下のようなRubyプログラムを実行します。2行目のbinding.irbでプログラムの実行が止まり、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_variables(省略形はi lと入力するとローカル変数を確認できます。また、helpでデバッグコマンドの一覧を確認できます。

irb(main):001> debug
irb:rdbg(main):002> info local_variables
%self = main
_ = nil
foo = 1
bar = nil

以前まではデバッグモードでの複数行入力ができませんでしたが、IRB v1.8.0からIRB同様に複数行入力ができるようになりました。これによりデバッグモードで使い勝手が変わり混乱する問題が解消されました。また、IRBのコマンドも利用できます。

# 複数行入力
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
...

その他の機能追加

その他、いくつかの機能が追加されています。

ページャーの導入

実行結果の行数がターミナルエミュレータの高さよりも長い場合にページャーを利用するようになりました。lsshow_sourceなどのコマンドもページャーを利用します。利用するページャーはRI_PAGER環境変数、PAGER環境変数、lessmoreの順で決定します。

たとえば利用できるEncodingの一覧を表示するメソッドのEncoding.listを実行した場合、即座に103行表示されていました。

図2 Encoding.listが実行され103行結果が表示される
図2

新しいIRBでは、ページャーが有効な場合はlessなどが起動します。この画面を抜けるにはお使いのぺージャーに応じてqなどを入力してください。

図3 Encoding.listの実行結果がページャーで表示される
図3

show_sourceコマンドに-sオプションが追加

メソッドの定義位置を表示できるshow_sourceコマンドにsuperを遡れるオプションが追加されました。

たとえば、以下のコードをtest.rbという名前で保存し、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_source Bar#fooを実行して、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.3に同梱されたIRBには補完機能の強化、debug.gemとの連携強化、その他たくさんのバグ修正や改善が含まれました。もしお気づきの点があれば、お気軽にIssues · ruby/irbにフィードバックしてください。

おすすめ記事

記事・ニュース一覧