From: shevegen@... Date: 2018-07-15T16:35:47+00:00 Subject: [ruby-core:87950] [Ruby trunk Feature#14913] Extend case to match several values at once Issue #14913 has been updated by shevegen (Robert A. Heiler). I don't have a big pro or con opinion on the functionality itself. However had, for the alternative syntax of: case |x, y| I think it is too reminiscent of block syntax style such as: object.each {|x, y| I would rather prefer to keep it simpler and not have this syntax for case/when structures. ---------------------------------------- Feature #14913: Extend case to match several values at once https://bugs.ruby-lang.org/issues/14913#change-72957 * 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: