前田です。

Masatoshi SEKI <m_seki / mva.biglobe.ne.jp> writes:

> >         collect
> >         select(->find_all)
> >         detect(->find)

僕もこのaliasはあった方がよいと思います。
Smalltalkerにselect:はないの?と訊かれてfind_allを使ってね、
と説明する必要がなくなるので。
# もっともまわりにSmalltalkerがいないのでそんなこと訊かれた
# ことはないのですけれど;-)

> > を用意してたんですけど,injectとか見るにいたって(というのは
> > 冗談ですが),日本人にはよく分からんとか思ってなくしちゃった
> > んですよね.

inject:into:がわかりにくいのは名前のせいだけではないという気も
します(^_^;

> > 関数メソッドのselectとの名称重複もちょっと気になっ
> > たし.複数の方がこれで良いとおっしゃるのなら,復活させても構
> > いません.

Arrayを継承したクラスを作る時にはまるかもしれませんね。
# Kernel::selectとすれば済む話ではありますが。

それはさておき本題の方を。

> collect, find_all とちょっと似ている delete_if について
> 教えて下さい。
(snip)
> となります。ブロックの値が true の要素を削除するんだと
> 思っていたのですが、nilでもtrueでも削除されるようです。
> # というか、falseを返したときだけ削除されない
> 
> if と同じ挙動の方がわかりやすい気がしますが、
> そういうものなんでしょうか?

おそらくバグだと思われます。
# まだRTEST忘れのバグが残ってたのですね。うーむ。

--- array.c~	Tue Jan 26 19:08:08 1999
+++ array.c	Sat Jan 30 00:08:23 1999
@@ -1007,7 +1007,7 @@
 
     rb_ary_modify(ary);
     for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) {
-	if (rb_yield(RARRAY(ary)->ptr[i1])) continue;
+	if (RTEST(rb_yield(RARRAY(ary)->ptr[i1]))) continue;
 	if (i1 != i2) {
 	    RARRAY(ary)->ptr[i2] = RARRAY(ary)->ptr[i1];
 	}


-- 
前田 修吾 (mailto:shugo / netlab.co.jp)