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>