Quantcast
Channel: hachi8833の記事一覧|TechRacho by BPS株式会社
Viewing all articles
Browse latest Browse all 1759

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

$
0
0

概要

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

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`がダメな理由と効果的な代替手段(翻訳)


Viewing all articles
Browse latest Browse all 1759

Trending Articles