[ruby-core:98595] [Ruby master Feature#16828] Introduce find patterns
From:
kazuki@...
Date:
2020-05-31 09:59:01 UTC
List:
ruby-core #98595
Issue #16828 has been updated by ktsj (Kazuki Tsujimoto).
Assignee set to ktsj (Kazuki Tsujimoto)
Status changed from Open to Assigned
> Accepted.
Thank you. I'll commit it.
> But we have to clarify the term "backtracking" here. It does backtrack but not with a guard, right?
Yes. This is exactly what I intend.
----------------------------------------
Feature #16828: Introduce find patterns
https://bugs.ruby-lang.org/issues/16828#change-85912
* Author: ktsj (Kazuki Tsujimoto)
* Status: Assigned
* Priority: Normal
* Assignee: ktsj (Kazuki Tsujimoto)
----------------------------------------
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>