$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Rubyでnewに渡ってきたパラメータ引数のaccessorを自動で作る

GitHub Copilotに補完されて面白いなと思ったのでメモ。たとえばLTSVのログを格納する構造を作るときに、渡ってきたパラメータ引数名を使ってアクセサを作りたいとする。以下のようなコードで実現が可能。

class Log
  # パラメータ引数をハッシュで受け取って
  def initialize(**fields)
    fields.each do |key, value|
      # インスタンス変数を作りつつ
      instance_variable_set("@#{key}", value)
      # attr_readerで動的に定義
      self.class.send(:attr_reader, key)
    end
  end
end

これを使うと、勝手にアクセサが生えてくる。

log = Log.new(
  user: 'frank',
  status: '200',
  size: '2326',
)
p(log.user) # => 'frank'
p(log.status) # => '200'
p(log.size) # => '2326'