Ruby/RailsでのBuilder Patternについて進んだような気がする

photo credit: Andrew* via photopin cc

前回からまた色々試行錯誤しているのだが、セッターを定義してもうまく値が設定されないし、self(インスタンス)を渡してもエラーになるしで、質問したところ、

blockselfを渡すようにしたので、block引数を受け取る必要があります。
以下のようになります。

Api::Label.builder do |label|
  label.category = 'bg-01'
end

と教えてもらえた。で、以下のように出来た。

def self.build_eval(&block)
  label = Label.new
  label.instance_eval(&block) if block_given?
  label
end

def self.build_call(&block)
  label = Label.new
  block.call(label) if block_given?
  label
end

@label_build_eval = Api::Label.build_eval do
  self.category = 'bg-01'
  self.text = 'new'
end

@label_build_call = Api::Label.build_call do | label |
  label.category = 'bg-01'
  label.text = 'new'
end

ただ記述量も増えているし、self.を抜いてもあまり嬉しくなくない?

もしそれが使いづらいということであれば、self側に倒すのもありだと思います。
ただselfってどっちのだろうと一瞬迷うかなという混乱もあるので、避けた方がよいのかなとちょっとだけ思いました。

ふむふむ、確かに。作り手の自分は分かっているけど、使い手の人からすると、selfがどれを指しているか分かり易くないな。また、block.call(self)にはエラーで出来ない旨を連絡したところ、

block.call(self)
これが上手くいかないのは多分クラスメソッド中でやっててselfがクラスオブジェクトになっているからかと。
どちらでもできるのはいいのですが、名前がbuild_evalとかbuild_callは変なので、個人的にはbuilderだけでいいのでは?と思います。

インスタンスメソッドで書くとどうなるか調べるか。