ScalaのDynamic traitとC#のdynamic(+ DynamicObject)の違いについて

主に私(@kmizu)と@neueccさんのやり取り。 私の最初のマジレス部分は、DynamicObjectというより変数や 引数に対するdynamicキーワードの方を意識していたために、 誤解を招きかねない記述になっているので、こちらの方を読んで いただくと、より良いと思います。
8
Kenji Yoshida @xuwei_k

C# のdynamicとは全然違うよなたぶん #scala

2011-03-26 19:23:55
neuecc @neuecc

@xuwei_k http://bit.ly/hIJdXY のものをC#に書く分には http://bit.ly/hEy2DB ですねえ。パッと見だと近いかな、と思ったのですが。

2011-03-26 19:31:21
neuecc @neuecc

あ、メソッドならTryInvokeMemberのほうがよかったかしら。ほとんど一緒ですが。

2011-03-26 19:33:14
Kenji Yoshida @xuwei_k

@neuecc あーなるほど。しかし自分もまだちゃんと使い方わかってないんですが(・_・;) なんだかコンパイル時にオプションつけないといけなくなるように変更になったみたいだし、まだRCだし…

2011-03-26 19:35:26
kmizu @kmizu

C#のdynamicとScalaのDynamic traitは似て非なる機能だよ。前者は変数を動的型付けにするもの、後者はとかRubyのmethod_missingみたいなもん。 #scala #csharp

2011-03-26 20:26:29
neuecc @neuecc

@kmizu C#もDynamicObjectを継承することで名前と引数から任意の戻り値を返せるのですが、それとは全然違うのでしょうか? http://bit.ly/hEy2DB

2011-03-26 20:29:52
kmizu @kmizu

@neuecc 機能的には似ていますが、異なる部分としては、まず、DynamicObjectから継承したクラスの動的な動作を有効にするには、対象の型がdynamicでなければならないのに対して、Scalaはそのような制限がありません。 #scala #csharp

2011-03-26 20:45:57
kmizu @kmizu

@neuecc また、C#では、DynamicObjectがTryConvert、TrySetMember、などの各種メソッドを持っているのをオーバーライドするのに対して、Scalaではそのような形にはなっていません。 #scala #csharp

2011-03-26 20:47:06
kmizu @kmizu

@neuecc ScalaのDynamic traitは、Dynamicを継承している型に対して、静的に保持していないメソッドをコンパイラが発見したときに、x.applyDynamic("name", args)のように自動的に書き換えます。 #scala #csharp

2011-03-26 20:49:15
kmizu @kmizu

@neuecc ただ、最初に似て非なる、で言及したのはC#のdynamicキーワードに対してのつもりだったので、その点、不正確だったのは、すいませんでした。

2011-03-26 20:50:13
neuecc @neuecc

@kmizu どうも丁寧にありがとうございます、イメージ出来ました。私も最初のは半分ネタ的に言ったのでちょっとアレでした。

2011-03-26 20:58:41
neuecc @neuecc

@kmizu C#はdynamicで宣言するとコンパイル時にCallSite経由の呼び出しに書き換えられ、そのうえで更に対象がDynamicObject(IDynamicMetaObjectProvider)を継承していると挙動をカスタマイズ出来る。といった形ですが(次...)

2011-03-26 21:05:53
neuecc @neuecc

@kmizu Scalaの場合はDynamicを継承している場合はそのままで自動的に書き換わる、ただしDynamicを継承してないものへの動的呼出しは出来ない。ということになるのでしょうか。であれば、使い方は変わってくるとは思いますので、違うというのも分かります。

2011-03-26 21:06:42
neuecc @neuecc

あ、いや、別に似てると主張する/したいわけじゃあないです。

2011-03-26 21:07:43
kmizu @kmizu

@neuecc はい。その通りだと思います。 >"Scalaの場合はDynamicを継承している場合はそのままで自動的に書き換わる、ただしDynamicを継承してないものへの動的呼出しは出来ない。"

2011-03-26 21:11:25
kmizu @kmizu

@neuecc Scalaの場合は柔軟性はC#に比べて低いが、その分挙動が単純で把握しやすい、といった印象です。 #scala #csharp

2011-03-26 21:12:59
kmizu @kmizu

@neuecc いえいえ。C#の(DynamicObject + dynamic) vs. Scalaなら、目的において似ているとは思います。ただ、仕様の面でかなり異なるので、その点は書いておいた方がいいかなと。ちょっと勢いで書いた部分もあったので、すいません。

2011-03-26 21:20:52
neuecc @neuecc

@kmizu いえ、本当にありがとうございます。お陰で差異など、理解が深まりましたので嬉しかったです。

2011-03-26 21:26:01