なかだです。

At Fri, 16 Sep 2005 17:12:13 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:27109]:
> |1.9でDir.globのdelimiterで分ける機能が働いてません。
> 
> この機能、要らないかなとも思うんですが...。
> 欲しいですか?

一つのパターンだけで表現できないものを一回で処理したいというこ
ともままあるので、相当する機能はあったほうがいいと思います。全
体を{,}で囲むのでもいいんですが、Dir.globはArrayで指定できるよ
うに、Dir.[]は複数指定できるようにするというのはどうでしょうか。


Index: dir.c =================================================================== RCS file: /cvs/ruby/src/ruby/dir.c,v retrieving revision 1.147 diff -U2 -p -u -r1.147 dir.c --- dir.c 14 Sep 2005 13:40:43 -0000 1.147 +++ dir.c 16 Sep 2005 09:18:35 -0000 @@ -1441,8 +1482,21 @@ rb_push_glob(VALUE str, int flags) /* '\ } - if (rb_block_given_p()) { - rb_ary_each(ary); - return Qnil; + return ary; +} + +static VALUE +dir_globs(long argc, VALUE *argv, int flags) +{ + VALUE ary = rb_ary_new(); + long i; + + for (i = 0; i < argc; ++i) { + int status; + VALUE str = argv[i]; + FilePathValue(str); + status = push_glob(ary, RSTRING(str)->ptr, flags); + if (status) rb_jump_tag(status); } + return ary; } @@ -1450,27 +1504,33 @@ rb_push_glob(VALUE str, int flags) /* '\ /* * call-seq: - * Dir[ string ] => array + * Dir[ array ] => array + * Dir[ string [, string ...] ] => array * * Equivalent to calling - * <em>dir</em>.<code>glob(</code><i>string,</i><code>0)</code>. + * <code>Dir.glob(</code><i>array,</i><code>0)</code> and + * <code>Dir.glob([</code><i>string,...</i><code>],0)</code>. * */ static VALUE -dir_s_aref(VALUE obj, VALUE str) +dir_s_aref(int argc, VALUE *argv, VALUE obj) { - return rb_push_glob(str, 0); + if (argc == 1) { + return rb_push_glob(argv[0], 0); + } + return dir_globs(argc, argv, 0); } /* * call-seq: - * Dir.glob( string, [flags] ) => array - * Dir.glob( string, [flags] ) {| filename | block } => nil + * Dir.glob( pattern, [flags] ) => array + * Dir.glob( pattern, [flags] ) {| filename | block } => nil * - * Returns the filenames found by expanding the pattern given in - * <i>string</i>, either as an <i>array</i> or as parameters to the - * block. Note that this pattern is not a regexp (it's closer to a - * shell glob). See <code>File::fnmatch</code> for the meaning of - * the <i>flags</i> parameter. Note that case sensitivity - * depends on your system (so <code>File::FNM_CASEFOLD</code> is ignored) + * Returns the filenames found by expanding <i>pattern</i> which is + * an +Array+ of the patterns or the pattern +String+, either as an + * <i>array</i> or as parameters to the block. Note that this pattern + * is not a regexp (it's closer to a shell glob). See + * <code>File::fnmatch</code> for the meaning of the <i>flags</i> + * parameter. Note that case sensitivity depends on your system (so + * <code>File::FNM_CASEFOLD</code> is ignored) * * <code>*</code>:: Matches any file. Can be restricted by @@ -1524,5 +1584,5 @@ static VALUE dir_s_glob(int argc, VALUE *argv, VALUE obj) { - VALUE str, rflags; + VALUE str, rflags, ary; int flags; @@ -1532,5 +1592,18 @@ dir_s_glob(int argc, VALUE *argv, VALUE flags = 0; - return rb_push_glob(str, flags); + ary = rb_check_array_type(str); + if (NIL_P(ary)) { + ary = rb_push_glob(str, flags); + } + else { + volatile VALUE v = ary; + ary = dir_globs(RARRAY(ary)->len, RARRAY(ary)->ptr, flags); + } + + if (rb_block_given_p()) { + rb_ary_each(ary); + return Qnil; + } + return ary; } @@ -1741,5 +1814,5 @@ Init_Dir(void) rb_define_singleton_method(rb_cDir,"glob", dir_s_glob, -1); - rb_define_singleton_method(rb_cDir,"[]", dir_s_aref, 1); + rb_define_singleton_method(rb_cDir,"[]", dir_s_aref, -1); rb_define_singleton_method(rb_cFile,"fnmatch", file_s_fnmatch, -1);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦