.irbrc で irb で使える独自メソッドを定義する
はじめに
この記事は2020年ふりかえりアドベントカレンダー 9日目です。これを書いているのは12月12日ですが、あまり気にしないことにします。昨日の記事は Hamada.rb #16 に参加 - いまブログ です。
今日は以下のツイートで教えていただいた内容についてまとめます。
なるほど。ord の戻り値は数値なのでなかなかむずかしそうですねえ。雑に
— バンビちゃん@実際はやくねこになりたい (@pink_bangbi) 2020年12月11日
class String
def ord16
ord\.to_s(16)
end
end
みたいなクラス拡張をしてしまうとか…?これを .irbrc に書いておくと irb 上でシュッと呼べるので便利
.irbrc とは
irb の設定ファイルです。ホームディレクトリに置くと、どこから irb を起動しても読み込まれます。ホームディレクトリに .irbrc がない場合、カレントディレクトリの .irbrc , irb.rc , _irbrc , $irbrc を順番にロードしようと試みます。
ちなみに Ruby 2.7 からの irb は、複数行編集、シンタックスハイライト、入力履歴など便利な機能がたくさん追加されてとても使いやすく便利になりました。 irb を使うなら Ruby 2.7 以上の環境で使うことをおすすめします。
.irbrc は Ruby スクリプトなので中に 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 に追加されなさそうなメソッド名にしておくと良いと思います。