LoginSignup
3
3

[Rails]あなたのコードを半分にできるかもしれない?? 知って得するnil制御 ~presence編~

Posted at

伝えたいこと

ボッチ演算子はすごい
presenceはすごい

~第1章~ はじまりのコード

子供 「ねぇねぇ父ちゃん!僕の書いたコードを見てよ!」
父親 「おぉ、どれどれ。見せてみろ。」

name = nil
if @account.present? && @account.name.present?
  name = @account.name
else
  name = '未設定'
end

父親 「アカウントがあったら名前を取得し、名前がなかったら[未設定]の文字を取得したいんやな」
子供 「さすが父ちゃん!見ただけで一瞬でわかっちゃうだ!」
父親 「まぁな。present?を活用しているのはグッドだ👍nilや空文字など柔軟に判定してくれるからな」
子供 「でしょ!(実はネットに載ってたのコピペしただけだけど...)」
父親 「ただ、もう少し簡単にかけるな。ぼっち演算子って知ってるか?」
子供 「ぼっち演算子..?」
父親 「その様子だとまだ知らないみたいだな。結構便利な書き方だから調べてみ」
子供 「わかった!」

~第2章~ ぼっち演算子

〜数日後〜
子供 「父ちゃん!ぼっち演算子ってすげぇ!」
父親 「おっ。調べてみたのか」
子供 「うん。今回のif文の部分書き換えたから見てよ!」
父親 「おぉ、どれどれ。見せてみろ。」

name = nil
if @account&.name.present?
  name = @account.name
else
  name = '未設定'
end

父親 「おぉ、いいじゃないか」
子供 「ifの部分がわざわざaccountのpresentを確認しなくても良くなってスッキリした!」
父親 「わかってるじゃないか👏」
子供 「もうこれ以上簡単に書けないよね?」
父親 「そうだなぁ...ちょっと考えさせてくれ」

~第3章~ 父親のpresence無双

〜5分後〜
父親 「さっきのコード考えてみたから、ちょっとこい」
子供 「え?もう何か思いついたの?」
父親 「これみてみろ」

name = @account&.name.present? ? @account&.name : '未設定'

子供 「え?他のコードはどこいったの?」
父親 「さらにこうだ!!!!!✍️」

name = @account&.name.presence || '未設定'

子供 「わかんない!わかんない!父ちゃんの言ってることが!!何ひとつわかんないよ!!!涙」
image.png
父親 「すまんすまん。説明するからちょっと落ち着くんだ。まず1つ目のやつから説明するぞ」

name = @account&.name.present? ? @account&.name : '未設定'

父親 「これは三項演算子といってな。@account&.name.present?この部分が真だったら@account&.nameが呼ばれてそうじゃない場合は'未設定'が呼ばれるということなんだ」
子供 「....へ、へぇ....(いまいちわからん涙)」

name = @account&.name.presence || '未設定'

父親 「で、だな。2個目のものはその三項演算子すらも使わない書き方で...」
子供 「(えっ。使わないの????)」
父親presenceというのはpresent?に似ているのだが、内容があったら内容を返して、ない場合はnilを返すというものなんだ。」
子供 「う、うん..」
父親 「そうすると、内容があった場合は左側の@account&.nameが採用されて、ない場合は'未設定'が使われるということになるんだ」
子供 「す、すげぇ...(僕はまだまだなんだな)」

~最終章~ その後の話

父親 「まぁこの辺りは慣れもある。別にお前の最初の書き方も悪いってわけではない。少しずつこういうテクニックを覚えていけばいいさ」
子供 「僕、頑張るよ!」
父親 「よし、今日はラーメンでも食いにいくか🍜」
子供 「やったー!!!」

こうして親子仲良くラーメンを食べに行ったのであった。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3