何もしないうちに休みオワタ。
帰省中暇だからあれとかこれとか書くんだーと思いつつ何もやらない現象ですよ。
なんだかんだでIronRubyと格闘してた気がする。VisualStudioを使わないでIronRubyの(CLR的な?)デバッグってできないものか。
IronRuby使ってると特にCLR連携でよくわからない所が多々出てくるのでメモ。
基本的にはドキュメントはあんまり役に立たないのでIronRuby Unleashedとソースを参照する。
GenericなListなんかに"hoge"が含まれるかどうか調べたい。C#では
##highlight cs List<string> hoge = new List<string>(); //~ここでhogeにデータ追加とか~ if (hoge.ICollection<string>.Contains("hoge")) { //ほげる }
こんな感じだっけ?
IronRubyではICollection<string>の部分はどうしたものか。
##highlight ruby include System::Collections::Generic hoge = new List[System::String].new #~ここでhogeにデータ追加とか~ if hoge.clr_member(ICollection[System::String], :Contains).call('hoge') then #ほげる end
こんな感じだった。clr_memberの第一引数に型を渡すことでそのインターフェースのメンバを明示的に検索できるようだ。
ちなみに、
##highlight ruby hoge.contains('hoge') hoge.clr_member(:Contains).call('hoge')
こんなんではContainsとかいうメンバーが無いと怒られる。あるって!!
だがContainsだったら実はこれでよい。
##highlight ruby include System::Collections::Generic hoge = new List[System::String].new if hoge.include?('hoge') then #ほげる end
Enumerator経由だから速度は推して知るべし。Listだったら大してかわらんだろうけどね。
IronRubyにはprivateバインディングモードってのがあって、これを使うとCLRクラスのprotectedメンバもprivateメンバもpublic的に呼び放題なんだって。使わんけどね。
##highlight cs class Hoge { protected void DoHoge() { //何かほげる } }
C#でこんなクラスを作ったとしよう。こんな意味不明なクラス作らないけど。作ったとしよう。
protectedなんでIronRubyでDoHogeを呼ぶと当然怒られる
##highlight ruby Hoge.new.do_hoge # => protectedだから無理てな例外が
そんな時は継承しよう。
##highlight ruby class IronHoge < Hoge end IronHoge.new.do_hoge # => なぜか呼べる
継承しただけでなぜか呼べてしまう。オーバーライドする必要すらねぇ。何故かは謎だがまあそんなもんなんだろう。テスト書くのに便利だからいいや。
C#つかCLRにはメソッドのオーバーロードがあるんだけどRubyには無いのでIronRubyにも無い。呼ぶ時は勝手に頑張って解決してもらうかclr_memberとoverloadメソッドを駆使して自分で選ぶ。じゃあオーバーライドしないといけない時はどうすんの。
##highlight cs class Hoge { protected virtual void DoHoge(int value) { //intほげ } protected virtual void DoHoge(string value) { //stringほげ } public void Hoge() { DoHoge(42); DoHoge('42!!!'); } }
C#クラスを継承してオーバーライドしちゃいたい。DoHogeなんだけど、2つあるよ。どうしよう。
##highlight ruby class IronHoge < Hoge def do_hoge(value) #valueには一体何が…? end end IronHoge.new.hoge
これでIronHoge#do_hogeはどのDoHogeをオーバーライドしてんのかって話ですよね。
これを実行するとvalueが整数で1回、文字列で1回呼ばれます。つまりどっちもオーバーライドされちゃった。1メソッドで2度おいしい。
C#的にはおいおいってな挙動だけどRubyから見ればまあごく普通なことなんで悪くない。上手くできてるね。
引数の数違いは試してないけどたぶん一番多い奴に合わせりゃ大丈夫じゃね。
Pretty nice post. I just stumbled upon your blog and wanted to say that I have really enjoyed browsing your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon!
> medical transcription<br>yes, I think so too.<br><br>I hope you can keep posting entry :)