From: naruse@...
Date: 2019-01-10T04:29:15+00:00
Subject: [ruby-core:90965] [Ruby trunk Feature#14444][Feedback] MatchData:	alias for #[]

Issue #14444 has been updated by naruse (Yui NARUSE).

Status changed from Open to Feedback

Following is better

```ruby
next_page = response.dig('meta', 'pagination', 'next')&.slice(/&page=(\d+)/, 1)
```

----------------------------------------
Feature #14444: MatchData: alias for #[]
https://bugs.ruby-lang.org/issues/14444#change-76171

* Author: zverok (Victor Shepelev)
* Status: Feedback
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
After introduction of safe navigation operator and other latest features, it could be pretty idiomatic to do this:

```ruby
next_page = response.dig('meta', 'pagination', 'next')&.match(/&page=(\d+)/)&.[](1)
```

The ugly thing here is, obviously, `&.[](1)`. When dealing with other classes we can use `dig(one_key)` or `at(index)` for arrays, but for `MatchData` there are no good synonym/alias.

Two options come to mind:

* `&.capture(1)` ��� singular from "captures"
* `&.at(1)` ��� like it is in Array, from which MatchData already borrows `values_at`

Yes, several `&.` in a row could be said a code smell and example may feel a bit extreme.

But for simple matches, the principle stays the same: "match something and extract if matched" otherwise should be written in much less readable code like this:

```ruby
if url =~ /&page=(\d+)/
  next_page = Regexp.last_match[1]
end
# or
if (m = url.match(/&page=(\d+)/))
  next_page = m[1]
end

# this seems the most reasonable syntax anyways:
next_page = url.match(/&page=(\d+)/)&.at(1)
```



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