7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby 2.7 で in 演算子が使えるようになる

Posted at

ブログ記事からの転載になります。

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 式のほうが正しいのかな。

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?