ブログ記事からの転載になります。
Ruby 2.7 で in
演算子が使えるようになります。
そもそも in
演算子ってなんやねんって話なんですが、同じく Ruby 2.7 で入る予定のパターンマッチ構文の in
になります。
例えばパターンマッチを使用することで次のような判定を行うことが出来ます。
def check user
# name に m が含まれていて age が 14以下
case user
in { name: /m/, age: (..14) }
"OK"
else
"NG"
end
end
p check(id: 1, name: "Homu", age: 13)
# => OK
p check(id: 2, name: "mami", age: 15)
# => NG
このようにパターンマッチを使用する事でより細かく条件を指定する事が出来ます。
in
演算子を使う
上記の例だと case <expr>; in <pattern>; ... end
みたいな構文を書く必要があるのでやや冗長に見えますね。
そこで in
演算子です。
in
演算子を使うことでパターンマッチ式を1行で書くことが出来ます。
def check user
# name に m が含まれていて age が 14以下
# in 演算子は true / false を返す
(user in { name: /m/, age: (..14) }) ? "OK" : "NG"
end
p check(id: 1, name: "Homu", age: 13)
# => OK
p check(id: 2, name: "mami", age: 15)
# => NG
in
演算子はパターンマッチと同様に <expr> in <pattern>
と書くことが出来ます。
また戻り値は true / false
になります。
これは次のような select
などと組み合わせるとより強力になります。
users = [
{ id: 1, name: "Homu", age: 13 },
{ id: 2, name: "mami", age: 14 },
{ id: 3, name: "Mado", age: 21 },
{ id: 4, name: "saya", age: 14 },
]
# @1 から _1 に変わったナンパラを使うとより簡潔にかける
p users.select { _1 in { name: /m/, age: (..14) } }
# => [{:id=>1, :name=>"Homu", :age=>13}, {:id=>2, :name=>"mami", :age=>14}]
これめっちゃ便利そうですね!!!
ちなみに in
演算子なのか in
式なのかどっちが正しいんですかね?
matz が in
operaetor と書いていたので in
演算子と明記しましたが in
式のほうが正しいのかな。