From: Koji Arai Date: 2000-03-24T02:41:16+09:00 Subject: [ruby-dev:9473] Symbol#<=> 新井です。 Symbolは、comparableであっても良いと思うのですがどうでしょ? # Symbolを含む配列をソートする処理が1.5でこけるのです。 以下、途中まで実装してみました。ただし、 ・ sym2の型チェック忘れてる。 ・ Comparable をインクルードするのを忘れてる。 ・ Symbol <=> Fixnum、Fixnum <=> Symbol を可能にするべき? ・ Symbol <=> String、String <=> Symbol を可能にするべき? ですけど。 Index: object.c =================================================================== RCS file: /home/cvs/ruby/object.c,v retrieving revision 1.13 diff -u -p -u -r1.13 object.c --- object.c 2000/03/09 08:59:54 1.13 +++ object.c 2000/03/23 16:26:39 @@ -507,6 +507,21 @@ sym_to_s(sym) } static VALUE +sym_cmp(sym1, sym2) + VALUE sym1, sym2; +{ + char *str1, *str2; + + if (sym1 == sym2) + return INT2FIX(0); + + str1 = rb_id2name(SYM2ID(sym1)); + str2 = rb_id2name(SYM2ID(sym2)); + + return INT2FIX(strcmp(str1, str2)); +} + +static VALUE sym_id2name(sym) VALUE sym; { @@ -1114,6 +1129,7 @@ Init_Object() rb_cSymbol = rb_define_class("Symbol", rb_cObject); rb_undef_method(CLASS_OF(rb_cSymbol), "new"); + rb_define_method(rb_cSymbol, "<=>", sym_cmp, 1); rb_define_method(rb_cSymbol, "type", sym_type, 0); rb_define_method(rb_cSymbol, "to_i", sym_to_i, 0); rb_define_method(rb_cSymbol, "to_s", sym_to_s, 0); -- 新井康司 (Koji Arai)