2012-12-11 12 views

答えて

5

注ポール・ブッチャーの答えで:powerアプローチは、おそらくどちらかの必要のない、あなたは内部APIへのアクセスを提供することをマクロでこれをやろうとしている場合(またはREPL以外の実行時のリフレクションでは、その点で問題ありません)しません公共のリフレクションAPIにmembersが提供する、昔ながらのSymbolisConstructor呼び出す例えばので

作業を、あなたは最初にあなたがMethodSymbolを持っていることを確認する必要があります。同様にtpeと同じです。もちろんREPL以外のコードで内部APIにキャストすることもできますが、これは危険で不必要です。

import scala.reflect.runtime.universe._ 

class Foo(name: String, i: Int) { def this(name: String) = this(name, 0) } 

typeOf[Foo].declaration(nme.CONSTRUCTOR).asTerm.alternatives.collect { 
    case m: MethodSymbol => m.paramss.map(_.map(_.name)) 
} 

それとも:

typeOf[Foo].declarations.collect { 
    case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name)) 
} 

これらのいずれもが、あなたに以下を与える:

List(List(List(name, i)), List(List(name))) 

希望としては以下がよりよい解決策です。ここでは例を簡略化するためにランタイムリフレクションを使用しましたが、これはUniverseと全く同じように動作し、Contextマクロから取得します。

+0

ああ - 良い点について:パワーモード。私の黒ずみを保存してくれてありがとう! –

1

このREPL転写産物は、あなたが軌道に乗る必要があり、私は願っています:

Welcome to Scala version 2.10.0-RC5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_09). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :power 
** Power User mode enabled - BEEP WHIR GYVE ** 
** :phase has been set to 'typer'.   ** 
** scala.tools.nsc._ has been imported  ** 
** global._, definitions._ also imported ** 
** Try :help, :vals, power.<tab>   ** 

scala> class Foo(x: Int, y: Float) 
defined class Foo 

scala> (typeOf[Foo].members find (_.isConstructor)).get.tpe.params map (_.name) 
res1: List[$r.intp.global.Symbol#NameType] = List(x, y) 
+0

コンパイル時にscalaクラスでどのように動作させることができますか? –

関連する問題