From: "Gerardo Santana Gómez Garrido" Date: 2006-03-25T12:38:02+09:00 Subject: [PATCH] to_str, to_s and StringValue ------=_Part_10786_14025047.1143257864405 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline If I understand correctly, StringValue is a way for writing duck-type friendly code. StringValue calls rb_str_to_str(obj) for trying to get a String object from obj, but looks for to_str only, not to_s. That was a problem for me when receiving Date objects because Date doesn't have to_str. Attached is patch for date.rb (lib_date_rb.patch) But while I was at it, I found only 7 references to to_str vs. 34 references to to_s. Only these objects implement to_str: *rb_cNameErrorMesg rb_cDLCPtr rb_cString and all of them have to_s, except rb_cNameErrorMesg. So, what's the point of looking for to_str in rb_str_to_str? Attached are the two patches needed (string_c.patch and error_c.patch) to change this. I'm changing to_str to to_s in string.c and aliasing to_str to to_s in error.c, for not breaking existing code, just in case. Thanks in advance for any clarification if I'm misunderstanding something. -- Gerardo Santana "Between individuals, as between nations, respect for the rights of others is peace" - Don Benito Ju=E1rez http://santanatechnotes.blogspot.com/ ------=_Part_10786_14025047.1143257864405 Content-Type: text/x-patch; name=lib_date_rb.patch; charset=us-ascii Content-Transfer-Encoding: 7bit X-Attachment-Id: f_el7e7y0v Content-Disposition: attachment; filename="lib_date_rb.patch" ? lib_date_rb.patch Index: lib/date.rb =================================================================== RCS file: /src/ruby/lib/date.rb,v retrieving revision 1.27 diff -u -r1.27 date.rb --- lib/date.rb 29 Oct 2005 08:03:46 -0000 1.27 +++ lib/date.rb 25 Mar 2006 02:00:11 -0000 @@ -1022,6 +1022,7 @@ # # The format used is YYYY-MM-DD. def to_s() strftime end + alias_method :to_str, :to_s # Dump to Marshal format. def _dump(limit) Marshal.dump([@ajd, @of, @sg], -1) end ------=_Part_10786_14025047.1143257864405 Content-Type: text/x-patch; name=string_c.patch; charset=us-ascii Content-Transfer-Encoding: 7bit X-Attachment-Id: f_el7e9g3x Content-Disposition: attachment; filename="string_c.patch" Index: string.c =================================================================== RCS file: /src/ruby/string.c,v retrieving revision 1.245 diff -u -r1.245 string.c --- string.c 24 Mar 2006 12:14:18 -0000 1.245 +++ string.c 25 Mar 2006 03:04:09 -0000 @@ -227,7 +227,7 @@ VALUE rb_str_to_str(VALUE str) { - return rb_convert_type(str, T_STRING, "String", "to_str"); + return rb_convert_type(str, T_STRING, "String", "to_s"); } static void ------=_Part_10786_14025047.1143257864405 Content-Type: text/x-patch; name=error_c.patch; charset=us-ascii Content-Transfer-Encoding: 7bit X-Attachment-Id: f_el7e9m4y Content-Disposition: attachment; filename="error_c.patch" Index: error.c =================================================================== RCS file: /src/ruby/error.c,v retrieving revision 1.121 diff -u -r1.121 error.c --- error.c 13 Feb 2006 04:53:21 -0000 1.121 +++ error.c 25 Mar 2006 03:27:30 -0000 @@ -975,6 +975,7 @@ rb_define_singleton_method(rb_cNameErrorMesg, "!", name_err_mesg_new, 3); rb_define_method(rb_cNameErrorMesg, "==", name_err_mesg_equal, 1); rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0); + rb_define_alias(rb_cNameErrorMesg, "to_s", "to_str"); rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_to_str, 1); rb_define_singleton_method(rb_cNameErrorMesg, "_load", name_err_mesg_load, 1); rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError); ------=_Part_10786_14025047.1143257864405--