【一人 Ruby Advent Calendar 2017】Ruby の &. 演算子【14日目】

一人 Ruby Advent Calendar 2017 15日目の記事になります。
今回は Ruby 2.3 で追加された &. 演算子(ぼっち演算子)について紹介します。

&. 演算子

&. 演算子はメソッド呼び出し(.)の代わりに使用できる演算子です。
obj&.hoge と呼び出した場合 objnil でない場合に hoge メソッドを呼び出します。
例えば、前回以下のようなコード例を書きましたが

# value が偽でなければ右辺を評価した値を返す
value && value + 10

# キーが存在していれば右辺を評価した値を返す
hash[key] && hash[key].hoge

上記のような && を利用したコードは &. を使用することで以下のように簡略化することができます。

# + をメソッドとして呼び出す
value&.+ 10

hash[key]&.hoge

こんな感じで nil チェックをかなり短く書くことができます。
また、メソッドに渡す引数は『メソッドが呼び出された場合のみ』評価されます。

# value が nil の場合は bar は評価されない
value&.hoge bar

これだと無駄な呼び出しが抑えれられるので便利そうですね。

&. 演算子つらい問題

さて、次のようなコードを &. 演算子で置き換えたい場合にちょっとつらい問題が発生します。

hash && hash[key]

上記のようなコードを &. 演算子で置き換える場合に

hash&.[key]

と書きたいんですが残念ながらこれはエラーになります。
上記でも書いたんですが演算子&. 演算子で呼び出したい場合はメソッド呼び出しのように記述する必要があります。

hash&.[] key

これはちょっとつらいですね…。
ちなみに Hash であれば #dig を使ったほうが見やすいかもしれません。

hash&.dig key

まとめ

  • &. を使うことで nil チェックが簡単になる
  • nil を返すメソッドをチェーンする場合などは便利
  • 演算子呼び出しで &. 演算子を使うのはちょっとつらいことがある


たまにつらいこともあるんですが、だいたいは便利。