.irbrc で irb で使える独自メソッドを定義する

はじめに

この記事は2020年ふりかえりアドベントカレンダー 9日目です。これを書いているのは12月12日ですが、あまり気にしないことにします。昨日の記事は Hamada.rb #16 に参加 - いまブログ です。

今日は以下のツイートで教えていただいた内容についてまとめます。

.irbrc とは

irb の設定ファイルです。ホームディレクトリに置くと、どこから irb を起動しても読み込まれます。ホームディレクトリに .irbrc がない場合、カレントディレクトリの .irbrc , irb.rc , _irbrc , $irbrc を順番にロードしようと試みます。

ちなみに Ruby 2.7 からの irb は、複数行編集、シンタックスハイライト、入力履歴など便利な機能がたくさん追加されてとても使いやすく便利になりました。 irb を使うなら Ruby 2.7 以上の環境で使うことをおすすめします。

.irbrcRuby スクリプトなので中に Ruby のコードを書くことができます。

また、 irb の設定値も定義できます。詳細はこちらを参照してください。

library irb (Ruby 2.7.0 リファレンスマニュアル)

class IRB::Context (Ruby 2.7.0 リファレンスマニュアル)

irb に独自メソッドを定義したくなった

さて irb を使うときに特定のメソッドを頻繁に呼び出しすることがあります。

例えば、私は文字コードを確認することが多いためこのようなメソッドを頻繁に使います。

"🐈".ord.to_s(16)
=> "1f408"

このように each_codepoint にブロックを渡す処理もよく書きます。

 "☃️".each_codepoint { p _1.to_s(16) }
"2603"
"fe0f"
=> "☃️"

ord each_codepoint の詳細についてはこちらの記事に書きましたので、もし興味があればご覧ください。

Rubyで文字コードを扱うコードを書くときに便利なメソッド集 - Qiita

これらは決まりきった書き方で、一々入力するのがとても面倒でした。 Dash というアプリでスニペットを登録するか悩んでいたところ、twitter で .irbrc でクラス拡張すればいいんじゃない? と教えてもらったのでそうすることにしました。

.irbrc でクラス拡張(オープンクラス)する

Ruby では組み込みライブラリも自由に書き換えることができます。

今回は String クラスに便利メソッドを定義しました。

~/.irbrc

class String
  def each_codepoint16
    each_codepoint { |s| p s.to_s(16) }
  end

  def ord16
    ord.to_s(16)
  end
end

irb を起動すると、特に何も読み込みしなくても定義したメソッドを呼び出せます。便利!

❯ irb
irb(main):001:0> "🐈".ord16
=> "1f408"
irb(main):003:0>  "☃️".each_codepoint16
"2603"
"fe0f"
=> "☃️"

クラス拡張ですので、既存のメソッドの上書きや、バージョンアップで同名のメソッドが追加されると挙動がおかしくなる可能性があります。

独自メソッドを定義する際は、 Ruby に追加されなさそうなメソッド名にしておくと良いと思います。

参考資料