From: daniel@...42.com Date: 2020-05-27T19:07:01+00:00 Subject: [ruby-core:98548] [Ruby master Feature#16828] Introduce find patterns Issue #16828 has been updated by Dan0042 (Daniel DeLorme). From the implementation linked above: ```ruby case [0, 1, 2] in [*, a, *] p a #=> 0; non-greedy match end case [0, 1, 2] in [*, b, 2, *] p b #=> 1; backtracking end ``` So yes, it supports "backtracking" in a certain fashion otherwise the second case wouldn't match. Note that it only supports splat expressions at the beginning and end of the array: ```ruby case [0, 1, 2, 3, 4, 5, 6] in [*, a, *, b, 5, *] p a, b end # syntax error, unexpected ',', expecting ']' # in [*, a, *, b, 5, *] ``` ---------------------------------------- Feature #16828: Introduce find patterns https://bugs.ruby-lang.org/issues/16828#change-85840 * Author: ktsj (Kazuki Tsujimoto) * Status: Open * Priority: Normal ---------------------------------------- I propose to add find patterns to pattern matching. # Specification ``` find_pattern: Constant(*var, pat, ..., *var) | Constant[*var, pat, ..., *var] | [*var, pat, ..., *var] ``` This patterns are similar to array patterns, but it finds first match values from the given object. ```ruby case ["a", 1, "b", "c", 2, "d", "e", "f", 3] in [*pre, String => x, String => y, *post] p pre #=> ["a", 1] p x #=> "b" p y #=> "c" p post #=> [2, "d", "e", "f", 3] end ``` Note that it doesn't support backtracking to avoid complexity. This means that the following code raises NoMatchingPatternError. ```ruby case [0, 1, 2] in [*, a, *] if a == 1 end ``` # Implementation * https://github.com/k-tsj/ruby/tree/find-pattern-prototype -- 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>