Rubyのdefine_method
を使うと外部からレシーバーに任意のメソッドを定義できますが、キーワード引数を持つメソッドを定義するときにやり方を迷ったのでメモ📝
define_method
は以下のようにblockを渡してメソッドを定義できますが、block引数ではキーワード引数を定義できませんが、
class Foo def foo; end end Foo.define_method(:bar) do |prefix| puts "#{prefix} bar!" end Foo.new.bar("Hello") #=> Hello bar!
define_method
には、以下の通りProcオブジェクトを渡すことができるので、
[PARAM] method: Proc、Method あるいは UnboundMethod のいずれかのインスタンスを指定します。 Module#define_method (Ruby 3.3 リファレンスマニュアル)
以下のようにキーワード引数を持つlamdaやprocのオブジェクトを渡すことでキーワード引数を持つメソッドをdefine_method
で定義することが出来ます✨
class Foo def foo; end end Foo.define_method(:bar, ->(prefix:) { puts "#{prefix} bar!" }) Foo.new.bar(prefix: "Hello") #=> Hello bar!
Rubyは色々method定義できたりして便利ですね!