[#17615] substitution at when-clause — Takaaki Tateishi <ttate@...>

立石です.

47 messages 2002/07/01
[#17619] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/01

まつもと ゆきひろです

[#17621] Re: substitution at when-clause — Takaaki Tateishi <ttate@...> 2002/07/02

At Tue, 2 Jul 2002 02:54:01 +0900,

[#17622] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/02

まつもと ゆきひろです

[#17624] Re: substitution at when-clause — Takaaki Tateishi <ttate@...> 2002/07/02

At Tue, 2 Jul 2002 13:30:17 +0900,

[#17627] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/02

まつもと ゆきひろです

[#17630] Re: substitution at when-clause — Takaaki Tateishi <ttate@...> 2002/07/02

立石です.

[#17631] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/02

まつもと ゆきひろです

[#17635] Re: substitution at when-clause — Takaaki Tateishi <ttate@...> 2002/07/03

立石です.

[#17639] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/03

まつもと ゆきひろです

[#17644] Re: substitution at when-clause — keiju@... (石塚圭樹) 2002/07/03

けいじゅ@日本ラショナルソフトウェアです.

[#17645] Re: substitution at when-clause — matz@... (Yukihiro Matsumoto) 2002/07/03

まつもと ゆきひろです

[#17647] Re: substitution at when-clause — keiju@... (石塚圭樹) 2002/07/03

けいじゅ@日本ラショナルソフトウェアです.

[#17649] Re: substitution at when-clause — Takaaki Tateishi <ttate@...> 2002/07/03

At Wed, 3 Jul 2002 17:48:58 +0900,

[#17651] Re: substitution at when-clause — keiju@... (石塚圭樹) 2002/07/03

けいじゅ@日本ラショナルソフトウェアです.

[#17730] Re: self in block — masaki <GEC01122@...>

16 messages 2002/07/20

[#17764] Re: self in block — masaki <GEC01122@...>

31 messages 2002/07/22
[#17765] Re: self in block — matz@... (Yukihiro Matsumoto) 2002/07/23

まつもと ゆきひろです

[#17768] Re: self in block — Tanaka Akira <akr@...17n.org> 2002/07/23

In article <1027383423.558649.31176.nullmailer@picachu.netlab.jp>,

[#17769] Re: self in block — matz@... (Yukihiro Matsumoto) 2002/07/23

まつもと ゆきひろです

[#17770] Re: self in block — Tanaka Akira <akr@...17n.org> 2002/07/23

In article <1027404202.545188.1283.nullmailer@picachu.netlab.jp>,

[#17771] Re: self in block — matz@... (Yukihiro Matsumoto) 2002/07/23

まつもと ゆきひろです

[#17772] Re: self in block — Tanaka Akira <akr@...17n.org> 2002/07/23

In article <1027406979.880878.1358.nullmailer@picachu.netlab.jp>,

[#17832] Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG. — nobu.nakada@...

なかだです。

17 messages 2002/07/26
[#17835] Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG. — matz@... (Yukihiro Matsumoto) 2002/07/26

まつもと ゆきひろです

[#17837] Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG. — nobu.nakada@... 2002/07/26

なかだです。

[#17842] Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG. — matz@... (Yukihiro Matsumoto) 2002/07/26

まつもと ゆきひろです

[#17886] line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) — nobu.nakada@... 2002/08/02

なかだです。

[#17893] Re: line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) — matz@... (Yukihiro Matsumoto) 2002/08/03

まつもと ゆきひろです

[#17897] Re: line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) — nobu.nakada@... 2002/08/03

なかだです。

[#17973] Re: line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) — nobu.nakada@... 2002/08/11

なかだです。

[ruby-dev:17779] Re: self in block

From: 西 啓一朗 <receiver@...>
Date: 2002-07-23 11:35:19 UTC
List: ruby-dev #17779
どうも、初めての発言です。西啓一朗@Ktouth Brand. です。

この議論、興味深く読ませてもらってましたが、ちょっと気になったので質問さ
せてください。

class Sample
  def initialize(&block)
    @proc = block
  end
end

obj = Sample.new {<n> n==0 ? 1:n*self[n-1]}

func = Proc.new {<n> n==0 ? 1:n*self[n-1]}
obj2 = Sample.new &func
obj3 = Sample.new &func

まず、上のコード例でのブロックの実際の処理ですが....

(0. 実行前に構文木にコンパイルされている) 
1. ブロック指定子「{」にさしかかる(=ブロック部分の構文木を参照する)と、
Procクラスのインスタンスの生成が行われる。
1a. このインスタンスには「ブロック部分の構文木への参照」と「ブロックで必
要になるブロック外のオブジェクトへの参照」が保持されている。
1b. この参照の中には、コード内に出てきたselfに対応するオブジェクトの参照
も含む。(メソッド呼び出しやインスタンス変数参照にも必要なので)
2. 生成したProcクラスのインスタンスを引数としてSample.newが呼ばれる。

....という理解で合っていますでしょうか?
合ってないなら、この質問は聞き流してください^^;



で、正木さんのselfすげ替え案で実装されたと仮定したとき、Procインスタンス
のselfに対応するオブジェクトを差し替えることになるわけだから、Procの中で
もSampleインスタンスが参照されているために循環参照が発生し、ガベージでき
ないオブジェクトになっちゃいませんか?

この推測が間違ってないなら、メモリリークに相当するバグになる気がします。

対して、ProcクラスのインスタンスのProc#callを呼び出している間だけ、selfすげ替えが
機能するのなら、デフォルトですげ替えるのではなく、もっと単純に

Proc#call_by(obj, *prm)

のようなメソッドが追加されれば十分な気がしますが……どうでしょう?


-- 
西 啓一朗 <ktouth@k-brand.gr.jp>

In This Thread