From: Koji Arai Date: 2003-08-03T16:31:51+09:00 Subject: [ruby-dev:21093] (ary - ary) preserves duplicated values 新井です。 rubicon やってて気が付いたのですが、念のため確認ですが、以下 は仕様変更ですね? p([1, 2, 1, 3, 1, 4, 1, 5] - [2, 3, 4, 5]) => ruby 1.6.8 (2002-12-24) [i586-linux] [1] => ruby 1.8.0 (2003-02-16) [i586-linux] [1, 1, 1, 1] => ruby 1.8.0 (2003-08-01) [i586-linux] [1, 1, 1, 1] 以下の変更によるようなので意図的だとは思いますが。 | Index: array.c | =================================================================== | RCS file: /usr/local/cvsup/ruby/ruby/array.c,v | retrieving revision 1.108 | retrieving revision 1.109 | diff -u -r1.108 -r1.109 | --- array.c 16 Jan 2003 07:34:01 -0000 1.108 | +++ array.c 3 Feb 2003 05:34:13 -0000 1.109 | @@ -2,8 +2,8 @@ | | array.c - | | - $Author: michal $ | - $Date: 2003/01/16 07:34:01 $ | + $Author: matz $ | + $Date: 2003/02/03 05:34:13 $ | created at: Fri Aug 6 09:46:12 JST 1993 | | Copyright (C) 1993-2003 Yukihiro Matsumoto | @@ -1649,23 +1649,6 @@ | } | | static VALUE | -rb_ary_diff(ary1, ary2) | - VALUE ary1, ary2; | -{ | - VALUE ary3; | - long i; | - | - ary2 = to_ary(ary2); | - ary3 = rb_ary_new(); | - for (i=0; ilen; i++) { | - if (rb_ary_includes(ary2, RARRAY(ary1)->ptr[i])) continue; | - if (rb_ary_includes(ary3, RARRAY(ary1)->ptr[i])) continue; | - rb_ary_push(ary3, RARRAY(ary1)->ptr[i]); | - } | - return ary3; | -} | - | -static VALUE | ary_make_hash(ary1, ary2) | VALUE ary1, ary2; | { | @@ -1684,6 +1667,23 @@ | } | | static VALUE | +rb_ary_diff(ary1, ary2) | + VALUE ary1, ary2; | +{ | + VALUE ary3, hash; | + long i; | + | + hash = ary_make_hash(to_ary(ary2), 0); | + ary3 = rb_ary_new(); | + | + for (i=0; ilen; i++) { | + if (st_lookup(RHASH(hash)->tbl, RARRAY(ary1)->ptr[i], 0)) continue; | + rb_ary_push(ary3, RARRAY(ary1)->ptr[i]); | + } | + return ary3; | +} | + | +static VALUE | rb_ary_and(ary1, ary2) | VALUE ary1, ary2; | { -- 新井康司 (Koji Arai)