概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Truthiness in Conditionals - Andy Croll
- 原文公開日: 2017/12/31
- 著者: Andy Croll
Ruby: 紛らわしい条件文を書かないこと(翻訳)
Rubyの条件構文は「trueっぽい(truthy)」のです。条件内でnil
と評価されるステートメントは、どんなものであってもfalse
と等価であると見なされ、nil
でないものはどんなものであってもtrue
と見なされます。
次のような書き方をしないこと
条件をこじらせた書き方。
# 悪例1
unless something.nil?
# 何かする
end
# 悪例2
if !something.nil?
# 何かする
end
# 悪例3
if !!something
# 何かする
end
以下のように書くこと
# 悪例1〜3のようにではなく、こう書くべし
if something
# 何かする
end
こう書くべき理由
最初の2つの悪例(unless
とかif !
)のように、否定条件内のステートメントの一部として#nil?
チェックを行うのは、多くの場合冗長です。あらゆるnil
値は「falseっぽい」(falsy)ので、#nil?
を使わない肯定条件で同じ結果を得られます。
#nil?
チェックを取り除いて、unless
をif
に置き換える(悪例1の修正)か!
を取り除く(悪例2の修正)ことで、同じことをもっと明快なコードで表せます。
悪例3の!!
という構文は、(truthyまたはfalseyである)あらゆる値を実際のtrue
やfalse
に変換するショートハンドです。しかしRubyの「trueっぽい」条件でこうした変換を行うのは冗長です。
冒頭のように書くべきでない理由
理解しづらくなります。nil
そのものかどうかを「本当に」チェックしたいのであれば(おそらく空の配列を扱っていて、nil
を通常と異なる方法で扱いたいとかでしょう)、問答無用で明示的なnil
チェックを使いましょう。