From: Takaaki Tateishi Date: 2002-08-05T00:05:12+09:00 Subject: [ruby-dev:17916] Re: [ruby-list:35696] Re: サブクラスのオブジェクト生成時に、スーパークラスの初期化を行うには ? At Sun, 4 Aug 2002 23:21:58 +0900, > > 感じだと思いますが,何を空のオブジェクト,使用不能状態と見なすの > > かは設計者/実装者に任されるということになるのでしょうか? > > たとえば,Data_Wrap_Struct してRubyのオブジェクトを作るものの場合 > > はもとのデータをどうやって生成するのかは実装者に任されてしまうと > > 思います. > > そういうことでいいのではないかと、私は思ってます。個人的には、 > 外部のリソースを使用するようなところはinitializeに持っていく、 > というのを一応の目安にしてますが。 なるほど,少し見えてきました.ありがとうございます. > > また,allocateで使用不能なオブジェクトを作ったことで,すべてのメ > > ソッドでその使用不能状態を検出する作業が必要になるなどの場合があ > > ると思います.このような場合でもallocateで使用不能状態を作るべき > > かでちょっと悩んでしまいます. > > これはinitializeする前だけでなく、たとえばcloseされたIOなんかに > も当てはまる話です。Rubyが静的な(変数でなく)オブジェクトのスコー > プ(というよりライフスパンといったほうが適切?)を持たない以上、対 > 応は必須だと思います。 ええ,対応する場合は楽なんですが,対応しない(closeがない)場合には どうしましょう? IOなどの場合にはもともとcloseかどうか検査することが必須だったので closeされた状態を空のFileオブジェクトと見なすことができました.同 様にProc,Threadでも中身がない(ブロック部分がない?)無効なProcオブジ ェクトができても良いのではないかと考えてしまうのですがどうなのでし ょう? 単に実装上困難という理由でしょうか? > 「インスタンスのタイプや構造を知る」というのがどういう意味なの > か図りかねてるのですが、少なくとも今回のinitializeとnewの分離と > allocation frameworkとは別の話です。allocation frameworkを持た > ない1.6でも、組込みのクラスでは分離されています。 もともと僕がnewを再定義することで直接オブジェクトの初期化も行って rb_obj_call_init()で何もしないinitializeは一応呼ぶようにしていたの がまずかったのでしょう.で,allocateが導入されてより一層この区別が 重要になってきたような気がしたのですが,どう分けるべきかでちょっと 悩んでいたのです. # そんなに重要ではなかったりしますか? allocateではクラス以外の情報なしでオブジェクトを作ることまでは理解 できるのですが,作るオブジェクトの初期値はどう決定するべきかという ことが疑問だったのです. で,たまたまcursesで中田さんがinitialize内でnewwin()するという状況 を見て,allocate内でnewwin()しないのはどういう判断からなのだろうと 思ったです.cursesの件についてはその判断基準が分かりました.ありが とうございます. -- Takaaki Tateishi