なかだです。

At Sun, 2 Sep 2001 06:46:54 +0900,
Koji Arai <JCA02266 / nifty.ne.jp> wrote:
> 一つ言えることは File.join の挙動が現状 (1) なのはUnixだけを
> 考えればそれで十分だからということは言えると思います。
> 
> で、私は DOSish ではある程度賢くなる必要があると考えてるわけ
> ですね(だって単純じゃないんだもの)。

 単純じゃないというよりも、破綻してるという方が近いような気も
しますが。

> それと挙動の一貫性、ルールの明確さも期待したい。私のこだわり
> はこちらの方が大きいですね。ドキュメント書くのに楽だし。
> 
> > だから、(3)を否定するわけではないのですが、それはそれで別途
> > 議論するということでもいいのではないかと思っています。
> > (2)は(3)を否定する/(3)によって否定される変更というわけでもな
> > いので、(2)を採用しておいて後から(3)を組み込んでいく、という
> > 段階的パスも採れるわけですし。
> 
> ま、この辺の方針はお任せします。

 [ruby-dev:31158]のjoin("c:","foo") => "c:./foo"というのは妥協
できる範囲のような気がします。とりあえずdosishで、先頭要素だけ
ドライブレターを認識するように試してみました。


--- dosish.c.orig Fri Aug 31 20:22:02 2001 +++ dosish.c Tue Sep 4 16:07:14 2001 @@ -301,10 +301,19 @@ rb_file_s_join(klass, args) ary = rb_funcall2(args, rb_intern("flatten"), 0, 0); + if (RARRAY(ary)->len > 0) { + str = RARRAY(ary)->ptr[0]; + if (RSTRING(str)->len == 2) { + if (RSTRING(str)->ptr[0] && RSTRING(str)->ptr[1] == ':') { + RARRAY(ary)->ptr[i] = str = rb_str_dup(str); + rb_str_cat2(str, "."); + } + } + } for (i=0; i<RARRAY(ary)->len; i++) { - RARRAY(ary)->ptr[i] = str = rb_str_dup(RARRAY(ary)->ptr[i]); + str = RARRAY(ary)->ptr[i]; if (RSTRING(str)->len > 0) { - conv_separator(RSTRING(str)->ptr); - d = extract_file_root(RSTRING(str)->ptr); - if (d == RSTRING(str)->len && RSTRING(str)->ptr[d-1] == '/') { + d = extract_file_drive(RSTRING(str)->ptr); + if (d+1 == RSTRING(str)->len && isdirsep(RSTRING(str)->ptr[d])) { + RARRAY(ary)->ptr[i] = str = rb_str_dup(str); /* chop! */ RSTRING(str)->len--; @@ -313,4 +322,6 @@ rb_file_s_join(klass, args) } str = rb_ary_join(ary, separator); + rb_str_modify(str); + conv_separator(RSTRING(str)->ptr); // str = rb_str_uniqsep_bang(str); return str;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦