2.5の`yield_self`が想像以上に何だかスゴい件について(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。原著者の許諾を得て翻訳・公開いたします。2.5でKernel#yield_selfメソッドが導入され、あらゆるオブジェクトで利用できるようになりました。第一印象では、その名のとおり適用対象のオブジェクトをyieldしてその結果を返すだけの、特にどうということもないメソッドかと思いました。3しかし見た目の(馬鹿馬鹿しいほどの)シンプルさにもかかわらず、このメソッドは値の処理をすっきりとチェインできるという素晴らしい機能を与えてくれるのです。}最後の例には「あいまいだ」「初心者にとって読みづらい」といった意見が常に寄せられますが、ほとんどの人にとってはかなりRubyらしい書き方であり、これと同様のコレクションの扱い(mapやselectやrejectなどのブロック処理のチェイン)で培われた習慣や直感とうまく調和します。このyield_selfメソッドよりも、Elixirっぽいパイプ演算子|>の方がいいという人を非常に多く見かけました。パイプ演算子の場合、既存の構文やエコシステムとうまく調和できません。このことは既に次の簡単な例からもわかります。JSON.method(:parse)).dig(...)か」「後者の場合、囲みはどこから始めるべきか」といった具合です。method(:メソッド名)という記法は便利ですしRubyの慣習にも沿っていますが、私たちのほとんどにとっては明らかに長ったらしく思えます。#13581では、どんなショートハンド構文がよいかについてRuby-coreによる議論が今も続いています。ここまでは別に目新しい話ではありませんしかしyield_selfがRubyのエコシステムと調和すべく設計されたという事実から、なかなか興味深い結果が生じています。これを追ってみることにしましょう。あなたの考え方次第では、以下にご紹介するコード例に大賛成するか毛嫌いするかのどちらかになるかもしれません。私は「こう書け」と言いたいのではなく、これらの例がいずれもちゃんと動作することと外見上はロジカルであるという事実と、時にそれが私のハートを心地よく揺さぶっていることをお伝えしたいのです。"Ruby":yield_self>やはり面白い挙動です。これでどんなことができるでしょうか。["Ruby"]まあ予想どおりの挙動です。これがメソッドを3〜5個ほどチェインしたときの末尾だとしましょう。(後でarrayだけを使うメソッドで処理したいなどの理由で)最終的に必要なのがarrayであれば、おそらくこれは一番すっきり書ける変換方法でしょう。これでおしまいではありません。ここまでは単なるウォーミングアップです。title)のような値のペアが必要になるが、この特定のメソッドがidだけをフェッチするとします。id]を返して欲しいとします。paragraph]の形のペアにしたいとしましょう。"2.4"]]なお、この程度の凶悪さでは物足りない方は、次の例を実行して動作の仕組みをじっくり理解してみると面白いと思います。2.4].zip('Ruby'.yield_self.cycle).map(&:reverse).each(&method(:fmt))次の例では、Enumerator::Lazyで処理を遅延します。1002しかし私の思いつく限りで最も便利そうな例は「誤った結果をnil化する」場合(サーバーエラー時にnilを返すなど)です。nilは有害だという反論があることは承知していますので、そうお思いの方は試さないことです。Faraday.get(url).yield_self.detect(&:success?)&.bodyendもう少し複雑な例です。変更後value.yield_self.grep(DATE_PATTERN).map(&Date.method(:parse)).first「よい子のみんなは真似しちゃだめだよ!」...それとも、やる?包み隠さず正直なところを申し上げると、上述のコード例については(控えめに言っても)複雑な心境です。実用に耐えそうなのは、最後の結果フィルタの例ぐらいでしょうか。これらが論理的に可能であるという事実で私がたっぷり楽しめたのも確かで、この楽しみを皆さまと分かち合いたかったのです。このメソッド名は嫌いです。mapではなく、enumerate_and_return_values的なものに見えてしまいます。facetsライブラリのKernel#ergoの方がメソッド名としてふさわしい」という意見もありました。あと、以下のツイートを見かけたので貼ってみました。2018の会場で発表されました。#14594を投げたのは当のzverokさんですが、まだ変わりそうな雰囲気があります。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。