[#1381] bound method — shugo@... (Shugo Maeda)

前田です。

21 messages 1998/02/04
[#1383] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1384] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1385] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1387] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1388] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#1389] Re: bound method — keiju@... (石塚圭樹 ) 1998/02/05

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

[#1396] Re: bound method — matz@... (Yukihiro Matsumoto) 1998/02/06

まつもと ゆきひろです

[#1410] GD — Masao Kanemitsu <masao-k@...>

30 messages 1998/02/10
[#1411] Re: GD — matz@... (Yukihiro Matsumoto) 1998/02/10

まつもと ゆきひろです

[#1413] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1417] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100623.PAA03533@eban.ase.ptg.sony.co.jp> の、

[#1420] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1426] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100733.QAA04028@eban.ase.ptg.sony.co.jp> の、

[#1428] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1429] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/10

<199802100757.QAA04212@eban.ase.ptg.sony.co.jp> の、

[#1431] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/10

わたなべです.

[#1434] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/12

<199802100952.SAA04346@eban.ase.ptg.sony.co.jp> の、

[#1435] Re: GD — WATANABE Hirofumi <watanabe@...> 1998/02/12

わたなべです.

[#1436] Re: GD — Masao Kanemitsu <masao-k@...> 1998/02/12

<199802120449.NAA00398@eban.ase.ptg.sony.co.jp> の、

[ruby-dev:1370] Re: [MethodIndex] Bug and question

From: keiju@... (石塚圭樹 )
Date: 1998-02-03 04:42:05 UTC
List: ruby-dev #1370
けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :01367 ] the message: "[ruby-dev:1367] Re: [MethodIndex]
Bug and question ", on Feb/02 19:01(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|>それであってます.問題は,あるクラスに対してどのモジュールが
>|>includeされているかどうかは(正確にはどのモジュールがextendさ
>|>れているか)はわかっても,それが直接includeされたのか,先祖に
>|>includeされたのかという情報は残ってないことです.

>|でも, ancestorsはちゃんとincludeしたモジュールの継承の順番が正しくなっ
>|ているようですが?

>順番は保存されています(結果的にlinked listになっている).が,
>それだけです.どこでという情報をどこに格納するかは難しいです
>ねえ.

ん? (今回は)順番さえわかれば満足なんですけど. でも, これは特異クラスの
順番ですね. 

結局言わんとしたことは, 特異クラスから元のクラスへの参照は保存されてい
ないて言う話だったんですかね??

>|つまり, 今迄通りで我慢してねってことですね(;_;
>
>なんか,良いアイディアがあれば良いのですが.
>
>klass.ancestors
>
>と
>
>class <<klass
>  ancestors
>end

# エラーですよ!!
# それはともかく, 特異クラスの継承列を返してもらえれば満足なんですが...

>を活用すればある程度の情報は得られるのかなあ.

全く不可能ではないとおもうんですが, めんどくさいですよね... 

こんな感じですか:

class Class
  def class_ancestors
    m_sets = {}
    a_serials = Class.ancestors.reverse.collect{|a| 
      if a.instance_of?(Module)
	m_sets[a] = a
      end
      [a]
    }
    for cls in ancestors.find_all{|m| ! m.instance_of?(Module)}.reverse
      ancs = [cls]
      for e in eval("class << cls; included_modules; end")
	for a in e.ancestors
	  if !m_sets.include?(a)
	    ancs.push a
	    m_sets[a] = cls
	  end
	end
      end
      a_serials.push ancs
    end
    a_serials.reverse!
  end
end

rbc0> class C3;end
rbc0> class C2 < C3;end
rbc0> class C1 < C2; end
rbc0> module M3;end
rbc0> module M2; include M3; end
rbc0> module M1; include M2; end
rbc0> C3.extend M3
rbc0> C2.extend M2
rbc0> C1.extend M1
rbc0> C1.class_ancestors
[[C1, M1], [C2, M2], [C3, M3], [Object], [Class], [Module], [Object], [Kernel]]

結果の解釈は, 要素の一番目は祖先で継承しているクラス/モジュールです. 2
番名工の要素は一番目の要素をextendしているモジュールお呼びその祖先を意
味しているとしました.

でも, 問題がありますね. rubyの(モジュールの)継承はincludeした順番に依
存しているので:

rbc0> class X1; end
rbc0> class X2 < X1;end
rbc0> class X2; include M3;end
rbc0> class X2; extend M3; end
rbc0> class X1; include M3; end
rbc0> class X1; extend M3; end

この場合, ancestorsとclass_ancestorsは同じ順番にならないといけないので
すが:

rbc0> X2.ancestors
[X2, M3, X1, M3, Object, Kernel]

rbc0> X2.class_ancestors
[[X2], [X1, M3], [Object], [Class], [Module], [Object], [Kernel]]

となって, しまいますね. 本来ならば:

[[X2, M3], [X1, M3], [Object], [Class], [Module], [Object], [Kernel]]

にならなくてはいけないのですが...

やはり, 今のAPIだけでは完全には継承列を再現することはできないみたいで
すね.

やはり:

1. 直接extendしているモジュールを調べるAPI
2. class_ancestors見たいなAPI

のいずれかををruby側で用意してもらえないと...

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju@rational.com <<---

In This Thread