【Ruby3.x】Object::SingleForwardable定数の使い方
SingleForwardable定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
SingleForwardable定数は、Rubyにおいて特定のオブジェクトにメソッドの委譲(デリゲート)機能を提供するモジュールを表す定数です。このモジュールを任意のオブジェクトにextendすることで、そのオブジェクトは、自身が直接持たないメソッド呼び出しを内部で保持する別のオブジェクトに肩代わりさせることができるようになります。
具体的には、SingleForwardableをextendしたオブジェクトには、def_delegatorやdef_delegatorsといったメソッドが追加されます。これらのメソッドを使用することで、特定のメソッド呼び出しを、指定した内部オブジェクトへ「転送」する設定を行うことができます。これにより、外部からは元のオブジェクトが直接そのメソッドを持っているかのように見え、内部の実装を隠蔽することが可能になります。
この機能は、オブジェクトのインターフェースをシンプルに保ちつつ、他のオブジェクトの機能を利用したい場合に非常に有効です。例えば、あるオブジェクトが内部にデータベース接続オブジェクトを持っていて、そのデータベース接続オブジェクトの特定のメソッド(例:query)を使いたい場合、SingleForwardableを用いてqueryメソッドを委譲することで、外部からは元のオブジェクトが直接queryメソッドを持つように見せることができます。
クラス全体でメソッドの委譲機能を使いたい場合はForwardableモジュールを使用しますが、SingleForwardableは、クラスのインスタンスごとに異なる委譲設定を行いたい場合や、特定のインスタンスに対してのみ委譲機能を提供したい場合に適しています。これにより、オブジェクト間の責任を明確に分離し、柔軟で保守性の高いコード記述に貢献します。
構文(syntax)
1require 'forwardable' 2 3class MyObject 4 def initialize 5 @internal_data = Struct.new(:value) { def get_value; value; end }.new("Hello, World!") 6 7 # このオブジェクト自身にSingleForwardableの機能を追加します 8 extend SingleForwardable 9 10 # @internal_data オブジェクトの get_value メソッドを、 11 # このMyObjectインスタンスの data メソッドとして委譲します 12 def_delegator :@internal_data, :get_value, :data 13 end 14end
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません