[#44310] プログラムに対して意図したとおりの文字列を渡す方法 — "Information Kanasansoft" <kanasansoft@...>

kanasanです。

9 messages 2007/12/05

[#44332] クラス:相互参照系の作成方法について質問です — "Saburoh Sakai" <sabroh@...>

はじめまして、さかいと申します。

12 messages 2007/12/11

[#44366] Rake改善プロジェクト — "Hajime Hoshi" <hajimehoshi@...>

東京大学修士 1 年の星一と申します。

14 messages 2007/12/19

[ruby-list:44339] Re: クラス:相互参照系の作成方法について質問です

From: "Saburoh Sakai" <sabroh@...>
Date: 2007-12-12 15:20:45 UTC
List: ruby-list #44339
本件、質問者のさかいです。
rubikichiさん、畠山さん、どうもありがとうございました。
クラスのプロトタイプ宣言のようなことができるのですね。
また、インスタンスを生成した後にメンバー変数にセットする方法は画期的
ですね。Cの中ではとくにD型は記述していないにもかかわらず、
セットした時点でインスタンス変数の型が決まり、しかもdがD型である
ことを前提としたメソッド呼び出しなども記述できました。(下記★)
c++のポリシーベース・クラスデザインをちょっと連想してしまいました。

class C
  def setD( d )
    @d = d
    @d.Flip() ★
  end
end

class D
 def Flip()
  puts "hi"
 end
end

c=C.new()
d=D.new()
c.setD( d )
c.setD( a ) #
最後の行、これはエラーになりますね、正しいポリシーとは
見なされなかった、といったところでしょうか。

以上、ありがとうございました。


----- Original Message ----- 
From: <m-hatake@jaist.ac.jp>
To: "ruby mailing list" <ruby-list@ruby-lang.org>
Sent: Wednesday, December 12, 2007 4:08 AM
Subject: [ruby-list:44334] Re: クラス:相互参照系の作成方法について質問です


> 畠山といいます。
>
> わたしがいつもやるのはインスタンスを生成した後にメンバー変数にセットする
> というものですが、どうでしょう。
>
> class A
> def setB(b)
> @b = b
> end
> end
>
> class B
> def setA(a)
> @a = a
> end
> end
>
> a = A.new
> b = B.new
> a.setB(b)
> b.setA(a)
>
>
> --
> hatake
>
> From: rubikitch@ruby-lang.org
> Subject: [ruby-list:44333] Re: クラス:相互参照系の作成方法について質問です 
> 
> Date: Wed, 12 Dec 2007 03:08:39 +0900
>
>> From: "Saburoh Sakai" <sabroh@tkc.att.ne.jp>
>> Subject: [ruby-list:44332] クラス:相互参照系の作成方法について質問です
>> Date: Wed, 12 Dec 2007 01:49:28 +0900
>>
>> るびきちです。
>>
>> > 現在、互いを相互に参照するクラスの系を作りたいのですが、
>> > そのようなことはRubyで可能でしょうか?
>>
>> 可能です。
>>
>> > いわゆる「循環参照」を実現させたいわけなのです…。
>> > 具体的には以下のようなことです。
>> > (snip)
>> > class A
>> >  b=B.new() ★
>> > end
>>
>> ただ、このbはローカル変数なのでメソッドからは参照できません。
>> おそらくクラス変数なんでしょう。
>> ということで、以下のコードでもクラス変数として宣言しておきました。
>>
>> こんな感じに空のクラスを宣言しておきます。
>> そうすることで実装を記述するときにお互いのクラスが見えるようになります。
>>
>> class A; end
>> class B; end
>>
>> class A
>>   @@b = B.new                     # => #<B:0xb7dc77d0>
>> end
>>
>> class B
>>   @@a = A.new                     # => #<A:0xb7dc75b4>
>> end
>>
>> --
>> rubikitch
>> Blog: http://d.hatena.ne.jp/rubikitch/
>> Site: http://www.rubyist.net/~rubikitch/
> 


In This Thread