概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: 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
この次リファクタリングで&.
を使うときは、振る舞いが変更されないかどうか注意しましょう。