Ruby: ぼっち演算子`&.`の落とし穴(翻訳)

概要

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

Ruby: ぼっち演算子&.の落とし穴(翻訳)

Ruby 2.3で追加された便利な&.演算子(ぼっち演算子)のおかげで、コードをずいぶんきれいにできました。これはRubyの新しい&.!=演算子に記載されているデフォルト演算子と連結して使えます。

ところで、最近&.を使ったためにバグが起きてしまいました。元々のコードは次のとおりです。

if start_date && start_date < start_of_month && end_date.nil?
  # ...
end

リファクタリングして&.を使ったのが次のコードです。

if start_date &.< start_of_month && end_date.nil?
  # ...
end

書き換え後のコードはすっきりましたが、ここにバグがあるのがおわかりでしょうか?かっこを追加して実行順序を確認してみましょう。

if start_date &.< (start_of_month && end_date.nil?)
  # ...
end

問題は、導入した&.の直後にある特殊演算子<が普通のメソッドコールになってしまったことでした。&.<の右辺はメソッドの引数とみなされて最初に実行されてしまいます。

修正するには、次のように前半部分にかっこを追加する必要がありました。

if (start_date &.< start_of_month) && end_date.nil?
  # ...
end

この次リファクタリングで&.を使うときは、振る舞いが変更されないかどうか注意しましょう。

関連記事

Railsの`Object#try`がダメな理由と効果的な代替手段(翻訳)

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833

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

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ