Ruby: 紛らわしい条件文を書かないこと(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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?チェックを取り除いて、unlessifに置き換える(悪例1の修正)か!を取り除く(悪例2の修正)ことで、同じことをもっと明快なコードで表せます。

悪例3の!!という構文は、(truthyまたはfalseyである)あらゆる値を実際のtruefalseに変換するショートハンドです。しかしRubyの「trueっぽい」条件でこうした変換を行うのは冗長です。

冒頭のように書くべきでない理由

理解しづらくなります。nilそのものかどうかを「本当に」チェックしたいのであれば(おそらく空の配列を扱っていて、nilを通常と異なる方法で扱いたいとかでしょう)、問答無用で明示的なnilチェックを使いましょう。

関連記事

Rubyにおけるunlessとコードの読みやすさについて

Rubyスタイルガイドを読む: 文法(3)演算子とif/unless

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ