🐘
【Ruby】便利な then(yield_self)メソッドについて
概要
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
メソッドの紹介もしていて、非常に似た動きをしているのでここで説明しておきます。
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