Ruby 2.7 でも 1行 in を利用して右代入を行う

さてさて、先日 Ruby の開発版に右代入を行う => 演算子が追加されました。
これは 左辺値右辺の変数 へ代入するための演算子になります。

1 + 2 => result
result # => 3

Ruby 2.7 でパターンマッチ構文が実装された

Ruby 2.7 ではパターンマッチ構文が実験的に新しく追加されました。
この構文では次のように in 句で特定の値をキャプチャする事ができます。

homu = { name: "homu", age: 14 }
case homu
in { name:, age: ..20 => age }
  p name   # => "homu"
  p age    # => 14
end

こんな感じで Hash の各要素に対してマッチするかどうかの判定とその値を任意の変数にキャプチャする事ができます。

パターンマッチの 1行 in 構文

先程のパターンマッチでは case ~ in ~ end という構文だったのですが次のようにして 1行で expr in pattern を書くこともできます。

homu = { name: "homu", age: 14 }

# expr in pattern と1行で書くことができる
# マッチしなかったら NoMatchingPatternError になる
homu in { name:, age: ..20 => age }
p name   # => "homu"
p age    # => 14

こんな感じで in が1つしかない場合は1行で簡潔に記述する事ができます。

1行 in で右代入を行う

さて、先程は in の右辺は { name:, age: ..20 => age } のような複雑なパターンだったんですが、実は右辺には『変数だけ』を定義することができます

homu = { name: "homu", age: 14 }

# in の右辺に左辺の値がそのまま代入される
homu in result
p result
# => {:name=>"homu", :age=>14}

つまり in を利用すると

1 + 2 in result
p result # => 3

と記述する事ができます。
これって右代入ですよね?
もちろんメソッドチェーンされた値も代入できます。

(1..10).to_a.shuffle.select { _1.even? }.map { _1 * 2 }.map { _1.to_s } in result
p result
# => ["20", "12", "16", "8", "4"]

完全に右代入ですね!!!

補足

このネタは 2月18日に行われた Ginza.rb の LT で発表しました。 気になる人は以下のスライドを読んでみるといいと思います。

1行 in の有効的な使いみち