ひさびさRubyでtapしてたら諸行無常を感じた
ここ2, 3ヶ月はGolangとjsとCrystalばっかりさわってて最近Ruby全然書いてなかったのですが一昨日からまた書いてます。
Rubyには『メソッド内の最後の評価値が戻り値になる」という言語仕様がありますね*1
そうするとFactoryっぽいものを書いてると、まあ例えばこうなるわけです。
module HogeFactory def create(opt) h = Hoge.new h.fuga = opt[:fuga] h.piyo = poyo(opt[:piyo]) h end end
んで、この最後のhがなんとなく落ち着かなさを演出するので、例えばこんな感じにできます。 参考: [初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita
module HogeFactory def create(opt) Hoge.new.tap do |e| e.fuga = opt[:fuga] e.piyo = poyo(opt[:piyo]) end end end
うん、最後の戻り値のhがなくなってすっきりしましたね。
いま書いてるのってyamlをパースして各クラスにマップするところなんでこういうコードが死ぬほど出てくるんですよね。
そんでずっとdefしてnewしてtapしてendするコードを書いてて思ったんだけど、これほんとにキレイなんすかね……。
賽の河原の地獄なんじゃないかと思ったけど……
というのが昨日の感想で、今朝ブログにまとめてるときに「どっちがマシかといったら下」なんだから別にtapに問題があるわけじゃないなって思い直しました。
我々に本当に必要なのはyaml to objectなmapperなのだなあ。
*1:これは正確な表現なんだろか。「最後の式の評価値が戻り値になる」と書きかけてなんとなくいまの表現にしている