From: "decuplet (Nikita Shilnikov)" <noreply@...>
Date: 2021-09-12T10:47:07+00:00
Subject: [ruby-core:105207] [Ruby master Feature#17355] Using same set of names in or-patterns (pattern matching with Foo(x) | Bar(x))

Issue #17355 has been updated by decuplet (Nikita Shilnikov).


It'd be nice to have this in 3.1 (no pushing).

----------------------------------------
Feature #17355: Using same set of names in or-patterns (pattern matching with Foo(x) | Bar(x))
https://bugs.ruby-lang.org/issues/17355#change-93616

* Author: decuplet (Nikita Shilnikov)
* Status: Assigned
* Priority: Normal
* Assignee: ktsj (Kazuki Tsujimoto)
----------------------------------------
Given pattern matching is officially supported in Ruby 3, I have an idea about making it more flexible.

Currently, this piece of code produces a syntax error
```ruby
case [1, 2]
in [1, a] | [a, 3] => a then a
end # duplicated variable name
```
Duplications don't seem to be a problem here, semantically-wise. We just need to check if all patterns have the same set of names. It's supported in OCaml (also here's an RFC in Rust https://github.com/rust-lang/rust/issues/54883) so I think it can work in Ruby too.

I've been using pattern matching in Ruby since day 1 and it worked great so far. Since I use OCaml daily too I miss this feature every once in a while :) 
A more practical example: imagine you have code like this

```ruby
def user_email(user)
  case user
  in User(email:) then email
  in Admin(email:) then email
  in Moderator(email:) then email
  end
end
```

Clearly, it could be simplified if or-patterns were supported:

```ruby
def user_email(user)
  case user
  in User(email:) | Admin(email:) | Moderator(email:) then email
  end
end
```

I'd like to know @ktsj's thoughts on this.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>