くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2011-01-05

_ 日記

何もしないうちに休みオワタ。

帰省中暇だからあれとかこれとか書くんだーと思いつつ何もやらない現象ですよ。

なんだかんだでIronRubyと格闘してた気がする。VisualStudioを使わないでIronRubyの(CLR的な?)デバッグってできないものか。

_ [Ruby] IronRubyメモ

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だったら大してかわらんだろうけどね。

CLRクラスのprotectedメンバを呼び出す

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から見ればまあごく普通なことなんで悪くない。上手くできてるね。

引数の数違いは試してないけどたぶん一番多い奴に合わせりゃ大丈夫じゃね。

本日のツッコミ(全2件) [ツッコミを入れる]
_ medical transcription (2011-01-24 21:54)

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!

_ taco-san (2011-01-25 09:38)

> medical transcription<br>yes, I think so too.<br><br>I hope you can keep posting entry :)


ページのトップへ | トップ «前の日記(2010-12-29) 最新 次の日記(2011-01-11)» | 編集 | kumaryu.net by kumaryu