2011-01-02 1 views
18

構造型がリフレクションによって実装されることはよく知られています。リフレクションを使用する他の言語構造がありますか?内部的にリフレクションを使用して実装されているScala機能はどれですか?

+0

ありがとうございました。私はこの時点で何をすべきか本当に分かりません。この場合単一のものを受け入れることは公正ではありませんが、複数のものを受け入れることもできません。 –

+0

は、匿名のオブジェクトに関するものを受け入れます。なぜなら、リフレクションが深刻なパフォーマンス上の問題に遭遇する唯一の構造型(一般的な構造型以外)だからです。 (たぶんそれは私だけですが、私は受け入れられた答えなしで私の質問の1つを残すことはできません) –

答えて

15

これは密接に構造タイプに関連しているが、任意の匿名のオブジェクトのインスタンスは、すなわち

new { def print = ("hello world") }.print 

リフレクションを使用します。

http://scala-programming-language.1934581.n4.nabble.com/Structural-types-reflection-td3071599.html

+4

+1:これは暗黙的な変換を定義する際に意味を持ちます。したがって、別途指摘する価値があります。要するに、*暗黙の関数の外にある*名前付き*クラスを常に定義し、そのクラスに変換する*別個の暗黙の関数を定義します。 –

+0

これは、変更するクラス時間にメソッドを追加するために暗黙の変換を定義するときとまったく同じです。 – Russell

5

あなたは反射としてisInstanceOf/asInstanceOfを考える場合には、パターンマッチングは、それらに

+1

これは、タイプチェックとキャストであり、非常に高速です。 – vadipp

+0

@vadipp - そうですね、私たちがそうする傾向があるときはいつでも、それを使うのを恐れるべきではないようです。http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in- java – bbarker

1

を依存している試験方法を見つけて呼び出すためにリフレクションを使用している、それは言語構造ではないですが、ScalaTestはSuite.executeが含まれています。

Scalaのpattern matchingは裏側で反射を使用していますか?構造タイプで

+0

Afaikでは、パターンマッチングはタイプチェック、型キャスト、 'unapply'メソッドのみを使用します。標準ライブラリクラスの場合、コンパイラはネイティブJVMスイッチ、if-elseコンストラクトなどを生成することもできます。ここでは反射は必要ありません。 – vadipp

+0

_タイプチェックが実際にありますか? – matanster

5

メソッドの呼び出しは、反射によって異なります

type T = { def startsWith(x:String):Boolean } 
def doSomethingWith(x:T) = x.startsWith("abc") 
doSomethingWith("abcdef") 
+2

OPは具体的に構造型を挙げており、他の例を求めています。 –

+0

@pelotom:通知OPはまたKen Bloomです。 – IttayD

+0

@IttayD:ハァッか。 OPは@Nermin Serifovic –

10

列挙型はnameOf機能の列挙約すべての可能な値のを見つけるためにリフレクションを使用しています。 (Enumeration.scalapopulateNameMapメソッドを参照してください)。最初にnameOfと呼んで、特定のEnumerationタイプを呼び出すと、これは1回実行されます。

2

Scalaのインタプリタは、反射の非常に頻繁に使用します。