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

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: A pitfall of the &. operator in Ruby 原文公開日: 2017/11/04 著者: Anton Katunin 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`がダメな理由と効果的な代替手段(翻訳)