Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby: `define_method`でキーワード引数を持つメソッドを定義するメモ📝

Rubydefine_methodを使うと外部からレシーバーに任意のメソッドを定義できますが、キーワード引数を持つメソッドを定義するときにやり方を迷ったのでメモ📝

docs.ruby-lang.org

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定義できたりして便利ですね!