|
[ruby-list:42119] Re: puts,printの出力をファイルにも出力するには: msg#00150lang.ruby.japanese
まつもと ゆきひろです 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> |
|---|---|---|
| Previous by Date: | [ruby-list:42118] Re: puts,printの出力をファイルにも出力するには, 岩崎 弘孝 |
|---|---|
| Next by Date: | [ruby-list:42120] Re: puts,printの出力をファイルにも出力するには, Nobuyoshi Nakada |
| Previous by Thread: | [ruby-list:42118] Re: puts,printの出力をファイルにも出力するには, 岩崎 弘孝 |
| Next by Thread: | [ruby-list:42121] RS232Cによるパソコン間の通信の不具合(質問), Hisashi Yahata |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |