2018年11月14日水曜日

Ruby で DSL を使ってクラスを初期化する方法

概要

Ruby でクラスからオブジェクトを生成するのに DSL っぽく生成する方法を紹介します

環境

  • macOS 10.14.1
  • Ruby 2.5.1p57

サンプル

  • vim my_dsl.rb
class ID
  def initialize
    yield(self)
  end

  def show
    puts @name
    puts @age
  end

  attr_accessor :name, :age
end
  • vim main.rb
require './main'

ID.new do |id|
  id.name = "hoge"
  id.age = 10
end.show

実行

  • ruby my_dsl.rb
hoge
10

解説

ポイントは initializeyield(self) を使う点です
こうすることでブロックの引数で ID クラスのオブジェクトを使うことができます

これで嬉しいのは初期化処理をカスタマイズできる点です
例えば以下のように初期化することもできます

require './my_dsl'

ID.new do |id|
  id.name = "hoge"
  id.age = 10
  id.show
end

これだとあまり旨味がないような感じがしますが要するに可変的なコンストラクタにすることができます

最後に

yield や Proc という機能が使いこなせるようになると更に完結かつモダンに Ruby を書けるようになると思います

参考サイト

0 件のコメント:

コメントを投稿