ScalaのDynamic traitとC#のdynamic(+ DynamicObject)の違いについて
@xuwei_k http://bit.ly/hIJdXY のものをC#に書く分には http://bit.ly/hEy2DB ですねえ。パッと見だと近いかな、と思ったのですが。
2011-03-26 19:31:21@neuecc あーなるほど。しかし自分もまだちゃんと使い方わかってないんですが(・_・;) なんだかコンパイル時にオプションつけないといけなくなるように変更になったみたいだし、まだRCだし…
2011-03-26 19:35:26C#のdynamicとScalaのDynamic traitは似て非なる機能だよ。前者は変数を動的型付けにするもの、後者はとかRubyのmethod_missingみたいなもん。 #scala #csharp
2011-03-26 20:26:29@kmizu C#もDynamicObjectを継承することで名前と引数から任意の戻り値を返せるのですが、それとは全然違うのでしょうか? http://bit.ly/hEy2DB
2011-03-26 20:29:52@neuecc 機能的には似ていますが、異なる部分としては、まず、DynamicObjectから継承したクラスの動的な動作を有効にするには、対象の型がdynamicでなければならないのに対して、Scalaはそのような制限がありません。 #scala #csharp
2011-03-26 20:45:57@neuecc また、C#では、DynamicObjectがTryConvert、TrySetMember、などの各種メソッドを持っているのをオーバーライドするのに対して、Scalaではそのような形にはなっていません。 #scala #csharp
2011-03-26 20:47:06@neuecc ScalaのDynamic traitは、Dynamicを継承している型に対して、静的に保持していないメソッドをコンパイラが発見したときに、x.applyDynamic("name", args)のように自動的に書き換えます。 #scala #csharp
2011-03-26 20:49:15@neuecc ただ、最初に似て非なる、で言及したのはC#のdynamicキーワードに対してのつもりだったので、その点、不正確だったのは、すいませんでした。
2011-03-26 20:50:13@kmizu C#はdynamicで宣言するとコンパイル時にCallSite経由の呼び出しに書き換えられ、そのうえで更に対象がDynamicObject(IDynamicMetaObjectProvider)を継承していると挙動をカスタマイズ出来る。といった形ですが(次...)
2011-03-26 21:05:53@kmizu Scalaの場合はDynamicを継承している場合はそのままで自動的に書き換わる、ただしDynamicを継承してないものへの動的呼出しは出来ない。ということになるのでしょうか。であれば、使い方は変わってくるとは思いますので、違うというのも分かります。
2011-03-26 21:06:42@neuecc はい。その通りだと思います。 >"Scalaの場合はDynamicを継承している場合はそのままで自動的に書き換わる、ただしDynamicを継承してないものへの動的呼出しは出来ない。"
2011-03-26 21:11:25@neuecc Scalaの場合は柔軟性はC#に比べて低いが、その分挙動が単純で把握しやすい、といった印象です。 #scala #csharp
2011-03-26 21:12:59@neuecc いえいえ。C#の(DynamicObject + dynamic) vs. Scalaなら、目的において似ているとは思います。ただ、仕様の面でかなり異なるので、その点は書いておいた方がいいかなと。ちょっと勢いで書いた部分もあったので、すいません。
2011-03-26 21:20:52