logo       

[ruby-list:42119] Re: puts,printの出力をファイルにも出力するには: msg#00150

lang.ruby.japanese

Subject: [ruby-list:42119] Re: puts,printの出力をファイルにも出力するには

まつもと ゆきひろです

In message "Re: [ruby-list:42118] Re: puts,printの出力をファイルにも出力するには"
on Tue, 25 Apr 2006 17:57:52 +0900, 岩崎 弘孝
<IH000667-Hi7X7xagcuRnb2RyOFEZTHf5DAMn2ifp@xxxxxxxxxxxxxxxx> writes:

|>要するにレシーバを持たないprintやputsは内部処理を適当に行っ
|>てくれるので、出力先($stdout)にwriteメソッドしか要求しない
|>(のでそれだけ用意すればよい)が、
|
|ですが、だいぶ前に「Ruby プログラム入門」と言う本を読んだときに
|puts,printなどはレシーバであるmainがオブジェクトの転送を適宜
|おこなうと書いてありましたが、このことを意味するのでしょうか?

Kernelモジュールにはprintやputsというprivateメソッドが定義さ
れていますが、これは引数を(適当に加工して)$stdout変数に代入
されたオブジェクトのwriteメソッドを使って出力するという仕様
になっています。

一方、$stdout.printとした場合には

* 私の例示したコードで$stdoutに代入したオブジェクトには独
自のprintメソッドは定義されていない

* よってスーパークラスをたどってprintメソッドを探すが、そ
れはKernelモジュールに定義されたprintメソッドであり、そ
れはprivateメソッドなのでレシーバを指定した形式では呼べ
ない。

* だから、エラーになる

ということです。これに対応するためには$stdoutに代入するオブ
ジェクトに独自にprintなどのメソッドを用意する必要があります。
$stderrについても同様です。

|> public :puts,:print #追加

これを追加すると$stdoutに対してprintとputsを呼び出した場合、
Kernelモジュールのメソッドを(publicに宣言し直したので)レシー
バを指定して呼べるようになります。しかし、挙動が変わったわけ
ではないので、$stderrに対して同じことができるわけではありま
せん。




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise