Issue #16828 has been updated by matz (Yukihiro Matsumoto).


Suppose we have the following code:
```
json = {name: "Alice", children: [{name: "Bob", age: 6}, {name: "Chad", age: 4}]}
case json
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age
end
```
It doesn't match because array pattern does not search for the element. It only matches for an array with single element named "Bob". So to find an element in an array with multiple elements, you have to use find pattern like:
```
json = {name: "Alice", children: [{name: "Bob", age: 6}, {name: "Chad", age: 4}]}
case json
in {name: "Alice", children: [*, {name: "Bob", age: age}, *]}
  p age
end
```

Matz

----------------------------------------
Feature #16828: Introduce find patterns
https://bugs.ruby-lang.org/issues/16828#change-85828

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