オープンクラス・モンキーパッチ

Rubyのオープンクラスについて、GluebyのNFT発行処理でTX弄るにあたって理解する必要がありそうなのでメモ。

オープンクラスとは

既存クラスを上書きできる機能。オーバーライドに近いね。

上書きのみでなく拡張も可能。

上書きはモンキーパッチと呼ばれる。

gemのアップデートなどによる意図せぬ挙動へのパッチとして採用されたりするとかなんとか。

実装

lib/monkey_patches 配下に設置するので、それらrbファイルを読み込むように設定。

Dir[Rails.root.join('lib/monkey_patches/**/*.rb')].sort.each do |file| require file end
config/initializers/monkey_patches.rb

参考までに、 config/initializers 配下にあるrbファイルは初期起動時に読み込まれる。

実際に書く。

require 'Glueby' module GluebyTap module Contract module Token def issue_tap_nft(wallet:, prefix:, content:) # 処理内容 # Glueby::Contract::Tokenにあるメソッドなど自由に使える ... end end module TxBuilder def create_tx_for_tap(issuer:, prefix:, data:) # 処理内容 # Glueby::Contract::TxBuilderにあるメソッドなど自由に使える ... end end end end Glueby::Contract::Token.singleton_class.prepend(GluebyTap::Contract::Token) Glueby::Contract::TxBuilder.prepend(GluebyTap::Contract::TxBuilder)
lib/monkey_patches/glueby/glueby_tap.rb

下2行で実際に読み込ませてる。モンキーパッチというよりはオープンクラス。

使うときは

tokens = Glueby::Contract::Token.issue_tap_nft()

あたかもGluebyさんのメソッドのように使える。こりゃいい。

参考