Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: IRBとRailsコンソールで強化された機能: 2024年上半期(翻訳)

概要

CC BY-NC-SA 4.0 Deedに基づいて翻訳・公開いたします。

CC BY-NC-SA 4.0 Deed | 表示 - 非営利 - 継承 4.0 国際 | Creative Commons

日本語タイトルは内容に即したものにしまた。
原文の目次は省略しました。

Ruby: IRBとRailsコンソールで強化された機能: 2024年上半期(翻訳)

ruby/irb - GitHub

Rubyエコシステムの中核の一部であるIRB(Interactive-RuBy)は開発者にとって大きな価値のあるツールです。IRBは変更や改善を早いペースで繰り返しているので、最新の機能を常にキャッチアップしておくことで開発ワークフローを大幅に強化できます。
本記事では、2024年上半期の時点(v1.11.0v1.14.0)のIRBの重要な更新と、Railsコンソールで強化された機能を紹介します。

v1.11.0より前のIRBで行われた機能強化については私の過去記事↓でお読みいただけます)

Ruby 3.3で大幅に強化されたIRBの解説(翻訳)

原注

IRBのアップグレードは、Gemfileにgem "irb"を明示的に追加する形でgemとしてインストールするだけでできます。

🔗 1: ヘルプコマンドとヘルプメッセージの改善

🔗 全般的な改善点

ヘルプ機能の良さは、使い勝手を左右する大事な決め手です。IRBのheopコマンドが今回大幅に強化されました。

  • 変更前の振る舞い
    RubyのAPIドキュメントを探索するには、別途riコンソールを開く必要がありました。

  • 最新の振る舞い
    ユーザーからの要望を反映して、riコンソールを開かなくてもIRB自身でヘルプメッセージを表示できるようになりました。

  • APIドキュメント
    IRBでshow_docを実行することでAPIドキュメントを検索できるようになりました。

訳注

Rubyをビルドするときに--disable-install-docオプションを渡していた場合は、show_docでドキュメントを検索できません。

🔗 コマンドを指定して詳細なヘルプを表示

新しいhelp コマンド名機能を用いてツールの利用法を詳しく表示できるようになり、機能を探しやすくなりました。

🔗 実行例

demo of the help command

irb(main):001> help edit
Usage: edit [FILE or constant or method signature]

Open a file in the editor specified in ENV["VISUAL"] or ENV["EDITOR"]

- If no arguments are provided, IRB will attempt to open the file the current context was defined in.
- If FILE is provided, IRB will open the file.
- If a constant or method signature is provided, IRB will attempt to locate the source file and open it.

Examples:

  edit
  edit foo.rb
  edit Foo
  edit Foo#bar

🔗 2: IRBの拡張API

IRB v1.13.0から、IRBの機能を拡張できる新しいAPIが導入されました。自分のライブラリでこのAPIを用いることで、IRBセッションに新しいコマンドを追加したり、特定のニーズを満たすヘルパーメソッドを作成したりといったカスタマイズや拡張が行えます。

🔗 ヘルパーメソッドとコマンドについて

  • ヘルパーメソッド
    アプリケーションとやりとりするRubyオブジェクトを返すよう設計されています。
    例: admin_userメソッドは常にadminユーザーオブジェクトを返します。

  • コマンド
    シェルコマンドと同様に、タスクを実行したり情報を表示したりします。
    例: IRBのshow_sourceコマンドやeditコマンド

🔗 実際のAPI拡張例

Railsコンソール - mission_control-jobs gem
appヘルパー connect_toコマンド
reloadコマンド |jobs_helpコマンド

このAPIについて詳しくは、以下のドキュメントを参照してください。

参考: irb/EXTEND_IRB.md at master · ruby/irb

🔗 3: 新コマンド

🔗 disable_irbコマンド

disable_irbコマンドを実行すると、そのセッションでのbinding.irb呼び出しを無効にします。これによって、特にループや頻繁に呼び出されるコードパスでのブレークポイントが使いやすくなります。

🔗 主な用途

以前のbinding.irbのユーザーは、以下のいずれかの方法でブレークポイントを終了していました。

  1. exit: 現在のブレークポイントを終了する
  2. exit!: プロセス全体を終了する

しかし、ループ内などで繰り返し実行されるコードパスでexitコマンドを使うと面倒なことになる可能性がありました。
このdisable_irbは、現在のブレークポイントを終了すると同時に、セッション内の以後のブレークポイントをすべて無効にします。これによって、プログラムで直ちに操作を再開できるようになります。

🔗 利用例

🔗 cdコマンド

新しいcdコマンドを使って、IRBセッション内でコンテキストを手軽に移動できるようになりました。

cd <オブジェクト名>を実行することで<オブジェクト名>を現在のコンテキストに切り替えることも、cd ..で直前のコンテキストに戻ることも可能です。

ただし、Prycdコマンドのようなcd @x/@ycd -などはサポートされていません。

🔗 利用例
# test.rb
class Foo
  def bar
    puts "bar"
  end
end

f = Foo.new

binding.irb

demo of the cd command

🔗 cdコマンドのヘルプメッセージ
Usage: cd ([target]|..)

IRB uses a stack of workspaces to keep track of context(s), with `pushws` and `popws` commands to manipulate the stack.
The `cd` command is an attempt to simplify the operation and will be subject to change.

When given:
- an object, cd will use that object as the new context by pushing it onto the workspace stack.
- "..", cd will leave the current context by popping the top workspace off the stack.
- no arguments, cd will move to the top workspace on the stack by popping off all workspaces.

Examples:

  cd Foo
  cd Foo.new
  cd @ivar
  cd ..
  cd

🔗 4: 既存のコマンドの強化

🔗 show_sourceコマンド

show_sourceコマンドが大幅に更新され、さらに強力で使いやすくなりました。

🔗 強化された機能
  • IRBセッション内で定義したメソッドも表示可能になった: 
    従来のshow_sourceコマンドは、IRBセッション内で定義したメソッドを表示できませんでしたが、この制約が解消されました。
irb(main):001* class Foo
irb(main):002*   def bar; end
irb(main):003> end
=> :bar
irb(main):004> show_source Foo#bar
From: (irb):2
def bar; end
=> nil
🔗 バグ修正
  • トップレベル定数の扱い:
    ::Postなどのトップレベル定数に関連する問題を修正。

  • 定数探索ロジックの改善:
    信頼性と使いやすさを向上。

  • ヘルプメッセージの充実:

Usage: show_source [target] [-s]

-s  Show the super method. You can stack it like `-ss` to show the super of the super, etc.

Examples:

show_source Foo
show_source Foo#bar
show_source Foo#bar -s
show_source Foo.baz
show_source Foo::BAR

🔗 irb:rdbgセッション

irb:rdbgセッションは、IRBに統合されたデバッグ機能を提供します。

🔗 バグ修正
  • 履歴の保存や入力認識に関連する問題を修正、信頼性や使いやすさを向上。
🔗 直前に実行したコマンドの再実行
  • c(continue)のような特定コマンドの実行後に改行のみを入力すると、そのコマンドを自動的に再実行します。この振る舞いはdebugのREPLの振る舞いと同じなので、より快適に使えるようになります。
🔗 追加情報
  • RUBY_DEBUG_IRB_CONSOLE=1環境変数を設定すると、debugのデフォルトのコンソールがirb:rdbgに置き換わります。これにより、ユーザーはIRBセッションのメリットを享受しながらdebuggerbinding.breakを利用できるようになります。
    irb:rdbgについて詳しくは、GitHubにあるIRBのREADMEを参照してください。

🔗 5: Railsコンソールの改善

🔗 Railsに適したプロンプト

Railsコンソールに、Rails固有のプロンプトが表示されるようになりました(訳注: これはRails 7.2.0から利用可能になる機能です)。

プロンプトの形式はアプリ名(環境名)>です。
例: my-app(prod)>

この機能強化によって、作業しているアプリケーション名や環境名がひと目でわかるようになり、コンテキストの取り違えミスを減らせます。

🔗 ヘルプメッセージがIRBのヘルプシステムに統合された

RailsのコマンドやヘルパーメソッドがIRBのヘルプメッセージシステムに統合され、IRBセッションでの検索や利用が行いやすくなりました(訳注: これもRails 7.2.0から利用可能になる機能です)。

🔗
my-app(dev)> help
...

Rails console
  reload!        Reloads the Rails application.

Helper methods
  conf           Returns the current IRB context.
  helper         Gets helper methods available to ApplicationController.
  controller     Gets a new instance of ApplicationController.
  new_session    [Deprecated] Please use `app(true)` instead.
  app            Creates a new ActionDispatch::Integration::Session and memoizes it. Use `app(true)` to create a new instance.

...

🔗 まとめ

2024年の上半期はIRBに素晴らしい機能強化がいくつも導入されました。より直感的になったhelpコマンドから強力な拡張APIまで、IRBはRuby開発者を楽にするために今も進化を繰り返しています。disable_irbcdなどのコマンドによって普段よく使うタスクがシンプルになり、show_sourceコマンドやirb:rdbgセッションによってデバッグがスムーズになりました。

Railsコンソールも負けずに強化されています。Rails固有のプロンプト形式が導入されたことで現在の環境がひと目でわかるようになり、RailsコマンドやヘルパーメソッドがIRBのヘルプシステムにより良い形で統合されたことで便利なコマンドを見つけやすくなりました。

最後に、これらの機能強化を可能にしてくれたコミュニティのコントリビュータの皆さんに心から感謝申し上げます。ぜひIRBの新機能を体験して、年末のさらなるIRBアップデートにもご期待ください。

関連記事

Ruby 3.3で大幅に強化されたIRBの解説(翻訳)

Ruby 3.2のIRBに導入された新機能(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。