From: naruse@... Date: 2014-11-05T09:45:05+00:00 Subject: [ruby-core:66095] [ruby-trunk - Feature #9179] [Assigned] MatchData#values_at should support named capture Issue #9179 has been updated by Yui NARUSE. Status changed from Open to Assigned Assignee set to Yukihiro Matsumoto I want to write following code, how do you think matz? ```ruby reg = %r<\A(?[A-Za-z][+\-.0-9A-Za-z]*):(?//(?[^/\\?#]+)(?/[^?#]*)|[^/?#][^?#]*|)(?:\?(?[^#]*))?(?:#(?.*))?\z> url = "http://example.com/hoge?foo=Bar#frag" reg =~ url p $~.values_at(:scheme, :authority, :"path-absolute", :query, :fragment) ``` ---------------------------------------- Feature #9179: MatchData#values_at should support named capture https://bugs.ruby-lang.org/issues/9179#change-49808 * Author: vzvu3k6k _ * Status: Assigned * Priority: Normal * Assignee: Yukihiro Matsumoto * Category: regexp * Target version: ---------------------------------------- =begin Using (({MatchData#[]})), we can access a named capture by its name. /(?...)/.match("foo")[:a] #=> "foo" /(?...)/.match("foo")["a"] #=> "foo" But (({MatchData#values_at})) accepts only Integer and refuses Symbol or String. /(?...)/.match("foo").values_at(:a) # I expected it returns ["foo"], but... #=> in `values_at': no implicit conversion of Symbol into Integer (TypeError) /(?...)/.match("foo").values_at("a") #=> in `values_at': no implicit conversion of String into Integer (TypeError) (These are tested in ruby 2.1.0dev (2013-11-28 trunk 43903) [i686-linux].) I think (({MatchData#values_at})) should work along with (({MathData#[]})) as follows: /(?...)/.match("foo").values_at(:a) #=> ["foo"] /(?...)/.match("foo").values_at("a") #=> ["foo"] In the patch, (({match_entry})) is removed because it is no longer used. Comments and code are based on (({rb_hash_values_at})) in hash.c. It passes (({make test-all})) except (({TestGc#test_gc_reason})), which fails also on the original version. =end ---Files-------------------------------- matchdata-values_at-named_capture.diff (1.89 KB) -- https://bugs.ruby-lang.org/