Issue #14913 has been updated by sawa (Tsuyoshi Sawada).


Perhaps, you can redefine `Array#===` and use arrays in the following way:

```ruby
case [x, y]
when [0..10, 0..10]
  ...
when [Array, nil]
  ...
when [Numeric, nil], [nil, Numeric]
  ...
end
```


----------------------------------------
Feature #14913: Extend case to match several values at once
https://bugs.ruby-lang.org/issues/14913#change-72977

* Author: zverok (Victor Shepelev)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
This proposal is part of the search for how pattern matching or its elements could be gently introduced to Ruby.
[This blog post](https://zverok.github.io/blog/2018-06-26-pattern-matching.html) (authored by me) provides context and "full" (more powerful than the current proposal, but more questionable also) idea, but I believe that this, more moderate, extension, could be a reasonable start.

**Proposal:**

Allow matching several values at once, when matching by case.
Example:

```ruby
case (x, y)
when (0..10, 0..10)
 ...
when (Array, nil) # coordinates were passed as an array in first argument
 ...
when (Numeric, nil), (nil, Numeric) # somehow one of coordinates were missing
 ...
```

**Justification:**
* The syntax change is minimal (no new keywords/special chars), yet visible (very little possibility of hidden incompatibilities)
* It is alike deconstruction when passing arguments to methods or blocks
* It allows _gradual_ adding of more features in the future versions of Ruby once the new syntax will become familiar:

```ruby
case (x, *y) # flatten y
when (*Numeric) # match only an array of numerics
 ...
when (_, Array) # skip any
 ...
when (Numeric, Numeric => y, Hash => options) # match & assign, like in rescue
 ...
```

**Links:**

* [Blog post](https://zverok.github.io/blog/2018-06-26-pattern-matching.html) with reasons, links to previous discussions and more examples
* [Experimental gem](https://github.com/zverok/pattern-matching-prototype) to try as much of new proposals as possible to imitate in the current Ruby version.

PS:

Alternative syntax (reusing "block arguments" sign):

```ruby
case |x, y|
when |0..10, 0..10|
 ...
when |Array, nil|
 ...
when |Numeric, nil|, |nil, Numeric| # OK, that's probably weird
 ...
```




-- 
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>