Using same set of names in or-patterns (pattern matching with Foo(x) | Bar(x))
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
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
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:
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.