From: nobu@...
Date: 2016-01-15T06:28:03+00:00
Subject: [ruby-core:72870] [Ruby trunk - Bug #11991] `Symbol#match` returns the match position, unlike `String#match` and `Regexp#match`
Issue #11991 has been updated by Nobuyoshi Nakada.
Seems a bug, but ["spec-style" tests](https://github.com/ruby/spec/blob/master/core/symbol/match_spec.rb) seems depending on the current behavior.
~~~diff
diff --git i/string.c w/string.c
index e4b323d..864f6c4 100644
--- i/string.c
+++ w/string.c
@@ -9253,7 +9253,6 @@ sym_casecmp(VALUE sym, VALUE other)
/*
* call-seq:
* sym =~ obj -> fixnum or nil
- * sym.match(obj) -> fixnum or nil
*
* Returns sym.to_s =~ obj
.
*/
@@ -9266,6 +9265,19 @@ sym_match(VALUE sym, VALUE other)
/*
* call-seq:
+ * sym.match(obj) -> MatchData or nil
+ *
+ * Returns sym.to_s.match(obj)
.
+ */
+
+static VALUE
+sym_match_m(int argc, VALUE *argv, VALUE sym)
+{
+ return rb_str_match_m(argc, argv, rb_sym2str(sym));
+}
+
+/*
+ * call-seq:
* sym[idx] -> char
* sym[b, n] -> string
* sym.slice(idx) -> char
@@ -9593,7 +9605,7 @@ Init_String(void)
rb_define_method(rb_cSymbol, "length", sym_length, 0);
rb_define_method(rb_cSymbol, "size", sym_length, 0);
rb_define_method(rb_cSymbol, "empty?", sym_empty, 0);
- rb_define_method(rb_cSymbol, "match", sym_match, 1);
+ rb_define_method(rb_cSymbol, "match", sym_match_m, -1);
rb_define_method(rb_cSymbol, "upcase", sym_upcase, -1);
rb_define_method(rb_cSymbol, "downcase", sym_downcase, -1);
diff --git i/test/ruby/test_symbol.rb w/test/ruby/test_symbol.rb
index 8960bec..f498fec 100644
--- i/test/ruby/test_symbol.rb
+++ w/test/ruby/test_symbol.rb
@@ -246,6 +246,30 @@
assert_equal(:fOo, :FoO.swapcase)
end
+ def test_MATCH # '=~'
+ assert_equal(10, :"FeeFieFoo-Fum" =~ /Fum$/)
+ assert_equal(nil, "FeeFieFoo-Fum" =~ /FUM$/)
+
+ o = Object.new
+ def o.=~(x); x + "bar"; end
+ assert_equal("foobar", :"foo" =~ o)
+
+ assert_raise(TypeError) { :"foo" =~ "foo" }
+ end
+
+ def test_match_method
+ assert_equal("bar", :"foobarbaz".match(/bar/).to_s)
+
+ o = Regexp.new('foo')
+ def o.match(x, y, z); x + y + z; end
+ assert_equal("foobarbaz", :"foo".match(o, "bar", "baz"))
+ x = nil
+ :"foo".match(o, "bar", "baz") {|y| x = y }
+ assert_equal("foobarbaz", x)
+
+ assert_raise(ArgumentError) { :"foo".match }
+ end
+
def test_symbol_poped
assert_nothing_raised { eval('a = 1; :"#{ a }"; 1') }
end
~~~
----------------------------------------
Bug #11991: `Symbol#match` returns the match position, unlike `String#match` and `Regexp#match`
https://bugs.ruby-lang.org/issues/11991#change-56103
* Author: Tsuyoshi Sawada
* Status: Open
* Priority: Normal
* Assignee:
* ruby -v:
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
`String#match` and `Regexp#match` return a `MatchData` when match succeeds:
~~~RUBY
"".match(//) # => #
//.match("") # => #
//.match(:"") # => #
~~~
But `Symbol#match` returns the match position (like `String#=~`):
~~~RUBY
:"".match(//) # => 0
~~~
Thus, `Symbol#match` behaves differently from `String#match` and `Regexp#match`. This is the documented behavior, but it may be a bug (together with the documentation).
On the other hand, if it is not a bug, what is the rationale?
--
https://bugs.ruby-lang.org/
Unsubscribe: