Ruby2.3の新機能、Safe Navigation Operator
うっかりはまったのでメモ
メソッド呼び出しの.の前に&をつけておくと、レシーバーがnilのときにNoMethodErrorを投げずにnilを返してくれる機能です。
str = nil
str&.upcase #=>nil
ただしこの機能は&と.をセットで書かないと使えないようで、例えばこういう書き方はできません。
# 論理演算子のNilclass#&が呼ばれる
ary = nil
p ary&[0] #=>false
# Array#&(配列の積集合)
ary = [1, 2, 3]
p ary&[0] #=>[]
# これならOK
p ary&.[](0) #=>1
# それならこう書いた方がいい気がする
p ary&.at(0) #=>1
# ちなみにこういうのはSyntaxError
num = nil
# num& == 0
# num& * 2
考えてみれば、論理演算子やArray#&のようなメソッドと区別するためにこのような仕様なのは当たり前ですね…