🐘

【Ruby】便利な then(yield_self)メソッドについて

2024/04/21に公開

概要

Ruby の then メソッドが便利だったので、紹介したくまとめました!
後半では以前解説した tap メソッドとの違いにも触れています!

then はブロックの最終評価を返す

then メソッドは Ruby2.6 から yield_selfメソッドのエイリアスとして導入されました。
本記事では then として紹介していきますが、yield_self でも同じことができます。

then メソッドはブロックを受け取ることができます。
ブロック引数は then が実行されたレシーバを取り、ブロックの最終評価を戻り値とします。

# 戻り値が、ブロック引数の3に2を足した5
3.then{|x| x + 2 }
=> 5

# 戻り値が、ブロック引数の "a" を大文字に変換した "A"
"a".then{|x| x.upcase }

# yield_self でも同じ
3.yield_self{|i| i + 2 }
=> 5

"a".yield_self{|x| x.upcase }
=> "A"

データベースの探索に便利

例えば特定の条件で、DB の検索条件を変えたいとなった場合に、
以下のように書くことができます。

article_id が nil のとき、 id = nil のものを返すのではなく、
articles すべてを返したいときの例です。

Article.where(is_published: true)
       .then{ |articles| article_id.nil? ? articles : articles.where(id: article_id) }

このように、スッキリと書くことができます。

tap メソッドはレシーバ自身を返す

以前 tap メソッドの紹介もしていて、非常に似た動きをしているのでここで説明しておきます。
https://zenn.dev/ebina_shohei/articles/5b212feaa63413

tap メソッドは、ブロックを実行し、戻り値としてレシーバ自身を返します。

# tap はレシーバを返す
"a".tap{ |x| x.upcase }
=> "a"

"a".tap{ |x| "あああ" }
=> "a"

# then はブロックの最終評価を返す
"a".then{ |x| x.upcase }
=> "A"

"a".then{ |x| "あああ" }
=> "あああ"

表にするとこんな感じです

戻り値
then(yield_self) ブロックの最終評価
tap レシーバ自身

Discussion