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'