西@九大です。

From: matz / netlab.co.jp (Yukihiro Matsumoto)
>   標準ライブラリにある部分を除いて100〜200行程度以下
>   # 必要な部分を標準ライブラリに追加してしまうのはアリです.

Ruby の*簡易*クラスブラウザを作ってみました。
まだ間に合うようでしたら、エントリさせて下さい。

あ、"tkscrollbox" を読み込んでいますが、いいんでしょうか?

>   簡単な使い方の説明付き

% ./TkSimpleClassBrowser.rb [ClassName]

クラス名を引数(省略可)として起動します。クラス名をダブルクリックすると、
メソッドが表示され、あれば下位の階層も表示します。メソッドをクリックし
ても何もおきません(寂しいです)。"Control-q" で終了します。

最初は、実用性を重視していたのですが、予想より Tk の敷居が高く、「どれ
だけ短くなるか(Simple)」を目標にした第2の人生が始まり現在に至る、です。

「ちょっとメソッド名を忘れてしまった」時ぐらいには役に立つと思います。
もう少し GUI と Ruby を勉強して、本格的なものを作りたいです。

それでは。
------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程二年
      西 和則   ( e-mail: kazunori / swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------

#!/usr/local/bin/ruby ### TkSimpleClassBrowser.rb - Ruby Simple Class Browser with Tk ### by Kazunori Nishi <kazunori / swlab.csce.kyushu-u.ac.jp> ### [usage] TkSimpleClassBrowser.rb [InitialClassName] ### Type "Control-q" to exit the program require "tkscrollbox" ### Global Variables ################################################# $initial_class = ARGV .shift || 'Object' $top_widget = TkFrame .new $widgets = {} $sub_classes = {} ### Functions ######################################################## def hierarchy_label (a_class, label = '+') ($sub_classes[a_class] ? label : ' ') + " #{a_class}" end def update_widget (name, items) $widgets[name] .delete 0, 'end' $widgets[name] .insert 'end', "*** #{name}(#{items .length}) ***" items .each do |item| $widgets[name] .insert 'end', hierarchy_label(item) end end def update_class (class_name) begin a_class = eval(class_name) class_methods = a_class .methods + a_class .singleton_methods update_widget('Class Method', class_methods .sort) update_widget('Instance Method', a_class .instance_methods .sort) rescue update_widget('Class Method', ["[BUG???]", "#{$!}"]) end end def update_class_with_hierarchy (class_name) $widgets['Class'] .insert 'end', "*** Class ***" begin (nest = eval(class_name) .ancestors) .reverse .each_with_index do |c, i| $widgets['Class'] .insert 'end', ' ' * i + hierarchy_label(c .to_s, i == nest .length - 1 ? '+' : '-') end rescue update_widget('Class Method', ["[BUG???]", "#{$!}"]) end end ### Main Routine ##################################################### ObjectSpace .each_object(Class) do |a_class| class_name, is_module = a_class .to_s .split('::') parent = is_module ? class_name : a_class .superclass .to_s client = is_module ? a_class .to_s : class_name $sub_classes[parent] = (($sub_classes[parent] || []) << client) .compact end for name in ['Class', 'Class Method', 'Instance Method'] $widgets[name] = TkScrollbox .new($top_widget) { relief 'raised'; width 30; height 20 pack('side'=>'left') } end $widgets['Class'] .bind "Double-Button-1", proc { this = $widgets['Class'] a_class = (selection = (this .get 'active')) .split .pop prefix = ' ' * (selection .index(a_class) / 2) if (pos = (this .index 'active') .to_i) > 0 update_class(a_class) case (selection .split)[0] when '+' this .insert pos, selection .sub('\+','-') this .delete pos + 1 $sub_classes[a_class] .sort .reverse .each do |c| this .insert pos + 1, prefix + hierarchy_label(c) end when '-' this .insert pos, selection .sub('-','+') this .delete pos + 1 while ((this .get pos + 1)[prefix .length, 1] =~ /[ +-]/) this .delete pos + 1 end end end } $top_widget .bind "Control-q", proc {exit} $top_widget .pack('fill'=>'both') $top_widget .focus update_class_with_hierarchy($initial_class) Tk.mainloop