ruby-changes:4494
From: ko1@a...
Date: Sun, 13 Apr 2008 16:02:34 +0900 (JST)
Subject: [ruby-changes:4494] kazu - Ruby:r15987 (ruby_1_8): * object.c (sym_to_proc): new method Symbol#to_proc; backported from 1.9. bug#19012
kazu 2008-04-13 16:02:24 +0900 (Sun, 13 Apr 2008)
New Revision: 15987
Modified files:
branches/ruby_1_8/ChangeLog
branches/ruby_1_8/NEWS
branches/ruby_1_8/object.c
branches/ruby_1_8/test/ruby/test_symbol.rb
Log:
* object.c (sym_to_proc): new method Symbol#to_proc; backported from 1.9. bug#19012
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=15987&r2=15986&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=15987&r2=15986&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/object.c?r1=15987&r2=15986&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/ruby/test_symbol.rb?r1=15987&r2=15986&diff_format=u
Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS (revision 15986)
+++ ruby_1_8/NEWS (revision 15987)
@@ -71,6 +71,10 @@
New exception class that causes Kernel#loop to stop iteration when
raised.
+ * Symbol#to_proc
+
+ New method.
+
* enumerator
* Enumerator is now a built-in module. The #next and #rewind
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog (revision 15986)
+++ ruby_1_8/ChangeLog (revision 15987)
@@ -1,3 +1,8 @@
+Sun Apr 13 15:55:52 2008 Kazuhiro NISHIYAMA <zn@m...>
+
+ * object.c (sym_to_proc): new method Symbol#to_proc; backported
+ from 1.9. bug#19012
+
Fri Apr 11 19:14:30 2008 Kazuhiro NISHIYAMA <zn@m...>
* object.c (rb_obj_tap): new method Object#tap; backported from
Index: ruby_1_8/object.c
===================================================================
--- ruby_1_8/object.c (revision 15986)
+++ ruby_1_8/object.c (revision 15987)
@@ -1205,7 +1205,35 @@
return sym;
}
+static VALUE
+sym_call(args, mid)
+ VALUE args, mid;
+{
+ VALUE obj;
+ if (RARRAY_LEN(args) < 1) {
+ rb_raise(rb_eArgError, "no receiver given");
+ }
+ obj = rb_ary_shift(args);
+ return rb_apply(obj, (ID)mid, args);
+}
+
+/*
+ * call-seq:
+ * sym.to_proc
+ *
+ * Returns a _Proc_ object which respond to the given method by _sym_.
+ *
+ * (1..3).collect(&:to_s) #=> ["1", "2", "3"]
+ */
+
+static VALUE
+sym_to_proc(VALUE sym)
+{
+ return rb_proc_new(sym_call, (VALUE)SYM2ID(sym));
+}
+
+
/***********************************************************************
*
* Document-class: Module
@@ -2749,6 +2777,7 @@
rb_define_method(rb_cSymbol, "to_s", sym_to_s, 0);
rb_define_method(rb_cSymbol, "id2name", sym_to_s, 0);
rb_define_method(rb_cSymbol, "to_sym", sym_to_sym, 0);
+ rb_define_method(rb_cSymbol, "to_proc", sym_to_proc, 0);
rb_define_method(rb_cSymbol, "===", rb_obj_equal, 1);
rb_define_method(rb_cModule, "freeze", rb_mod_freeze, 0);
Index: ruby_1_8/test/ruby/test_symbol.rb
===================================================================
--- ruby_1_8/test/ruby/test_symbol.rb (revision 15986)
+++ ruby_1_8/test/ruby/test_symbol.rb (revision 15987)
@@ -74,4 +74,8 @@
assert_inspect_evaled(':$0')
assert_inspect_evaled(':$1')
end
+
+ def test_to_proc
+ assert_equal %w(1 2 3), (1..3).map(&:to_s)
+ end
end
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/