内部クラスと外部クラスの難
id:omochist:20061102:1162475536
ぶっちゃけ,内部クラスのinitializeで@xを渡してたら,内部の意味が無いよね.別に外部でもいけるよね.ただ内部クラスのスコープを外部クラスに限定しているだけで,そんなに利点が無いんじゃないの.
ってことに今朝気づいた.
なぜそもそも内部クラスを考えているかというと,JavaのGUIの,ActionListenerをimplementした内部クラスを幾つも外部クラスに保持させて,幾つかのButtonにその幾つかの内部クラスを突っ込み,色んなボタンで色んな処理ができる,そんなことがRubyでもできないかしらと言う事を考えていたわけ.そこで,もう一度内部クラスをJavaで復習.
public class Hoge { private String x = "hoge"; public static void main (String [] args) { Hoge h = new Hoge(); h.hoge(); } public void hoge () { Fuga f = new Fuga(); f.hogera(); System.out.println(x); } public class Fuga { public void hogera () { System.out.println(x); x += "fuga"; } } }
で,実行結果が
% java Hoge hoge hogefuga
これが期待するものなのよねぇ.
ごちゃごちゃと考えていても意味が無いので,内部クラスについてググってみた.
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
クロージャのカッコいいところ、其の壱。クロージャはコードブロックである。かつ、クロージャのある環境と結びつくことができる。これが正式なクロージャの形であり、関数ポインタやら内部クラスやらその他もろもろのクロージャっぽいものと一線を画す機能です。
てことは,クロージャは内部クラスよりも強いと読んでいいわな.すなわち,クロージャをウマく使うと内部クラスみたいに,と言うよりはむしろ内部クラスより高度に使えると言う事かな.
そう考えると,例えばJavaで言うbutton.addActionListener(new HogeListener())みたいなことをしなくても,Rubyならprocを渡してやれば解決するんだよね.あぁ,そりゃ確かに,内部クラスは要らないかもしれないし,考えなくても良い.別にわざわざActionListenerをimplementしてactionPerformed()を定義したクラスのオブジェクトを渡す必要なんて無くて,そのまま関数を渡してやれば良いんだ.高階関数みたいにして.もしくはブロック渡してyield.便利だねRuby.