From: nobu.nakada@... Date: 2003-11-06T11:20:11+09:00 Subject: [ruby-dev:21853] Re: StringIO#path なかだです。 At Thu, 6 Nov 2003 10:20:28 +0900, Tanaka Akira wrote: > > |> あるいはIOにpathは定義されてないんだから、定義しないべきなの > > |> かなあ。それともIOにもpathを定義してnilを返すようにするか。 > > | > > |関係ないけど、STDIN.pathでそれっぽいのを("/dev/stdin"とか)返し > > |てくれるといいなぁと思ったことはあります。 > > > > どうするのが良いでしょうねえ。Linuxから/dev/stdinはあるんで > > すが。 > > /dev/fd/0 というのもありますね。 > でも、path を定義するのはちょっと微妙かなぁ。 何に使いたかったか思い出しました。フィルタのようなもので入力ファ イル名と行番号を出すときに、STDINかどうかで判断しなきゃいけない のがイヤだったのでした。だから、別に存在するファイル名じゃなく て""みたいのでも充分なんですが。 > どっちかっていうと、STDIN.inspect "#" とかを返してくれたら > なぁと思います。 なので、inspectとはちょっと違うんですよね。 > ついでにいえば、 > > % ruby -e 'f = open("/dev/null"); f.close; p f; p f.path' > # > "/dev/null" > > というようにせっかく close 後にも path が残るようになったのに inspect > で出ないのはちょっと悲しいかな。"# とかになっ > てくれると嬉しい。 こんなですか。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.233 diff -u -2 -p -r1.233 io.c --- io.c 4 Nov 2003 09:13:57 -0000 1.233 +++ io.c 6 Nov 2003 02:17:43 -0000 @@ -652,11 +652,17 @@ rb_io_inspect(obj) { OpenFile *fptr; - char *buf, *cname; + char *buf, *cname, *st = ""; + long len; fptr = RFILE(rb_io_taint_check(obj))->fptr; - if (!fptr || !(fptr->f || fptr->f2) || !fptr->path) return rb_any_to_s(obj); + if (!fptr || !fptr->path) return rb_any_to_s(obj); cname = rb_obj_classname(obj); - buf = ALLOCA_N(char, strlen(cname) + strlen(fptr->path) + 5); - sprintf(buf, "#<%s:%s>", cname, fptr->path); + len = strlen(cname) + strlen(fptr->path) + 5; + if (!(fptr->f || fptr->f2)) { + st = " (closed)"; + len += 9; + } + buf = ALLOCA_N(char, len); + sprintf(buf, "#<%s:%s%s>", cname, fptr->path, st); return rb_str_new2(buf); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦