Project

General

Profile

Actions

Feature #8396

closed

Allow easier destructuring of MatchData

Added by goshakkk (Gosha Arinich) almost 11 years ago. Updated almost 11 years ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:54929]

Description

=begin

(((I have opened ((<"a PR for this on GH @ rails/rails"|URL:https://github.com/ruby/ruby/pull/300>)) for this but @marcandre (Marc-Andre Lafortune) closed it and suggested I submit it here. I'll copy my proposal text here.)))

Currently, you can get something out of (({MatchData})) like this:

m = "2_apples".match /(\d+)_(apple|orange)s?/
count, thing = m[1], m[2]

or

, count, thing = "2_apples".match(/(\d+)(apple|orange)s?/).to_a

or

count, thing = "2_apples".match(/(\d+)_(apple|orange)s?/).captures

or, as @marcandre (Marc-Andre Lafortune) suggested, you can use splat operator

, count, thing = * "2_apples".match /(\d+)(apple|orange)s?/

However, this extra (({#to_a})) or (({#captures})) (or splat) that you have to add makes things slightly more verbose.

With this PR, it would be possible to do the following:

count, thing = "2_apples".match /(\d+)_(apple|orange)s?/

Which looks a bit cleaner and nicer. So what do you think?

=end


Files

match_data_to_ary.patch (827 Bytes) match_data_to_ary.patch goshakkk (Gosha Arinich), 05/12/2013 06:49 PM

Updated by matz (Yukihiro Matsumoto) almost 11 years ago

I like the basic idea, but #to_ary is a method to convert into array implicitly, that means it expect the receiver provides array behavior. MatchObject does not behave like Array.
Maybe we should add another implicit conversion method for right hand side of multiple assignment.

Matz.

Updated by jeremyevans0 (Jeremy Evans) almost 11 years ago

This could be a use case for the @* method proposed in #2013.

Actions #3

Updated by goshakkk (Gosha Arinich) almost 11 years ago

=begin
Yep, the (({*@})) is a nice idea. Would be awesome if it could be used for splat-less destructuring as well. @matz (Yukihiro Matsumoto) what do you think about this?
=end

Updated by naruse (Yui NARUSE) almost 11 years ago

You can use named capture assigning

irb(main):005:0> /(?\d+)_(?apple|orange)s?/ =~ "2_apples"
=> 0
irb(main):006:0> count
=> "2"
irb(main):007:0> thing
=> "apple"

Updated by zzak (zzak _) almost 11 years ago

  • Status changed from Open to Feedback
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0