概要
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
解説
ポイントは initialize
で yield(self)
を使う点です
こうすることでブロックの引数で ID クラスのオブジェクトを使うことができます
これで嬉しいのは初期化処理をカスタマイズできる点です
例えば以下のように初期化することもできます
require './my_dsl'
ID.new do |id|
id.name = "hoge"
id.age = 10
id.show
end
これだとあまり旨味がないような感じがしますが要するに可変的なコンストラクタにすることができます
最後に
yield や Proc という機能が使いこなせるようになると更に完結かつモダンに Ruby を書けるようになると思います
0 件のコメント:
コメントを投稿