2012-12-11 93 views

回答

5

注意,在保羅·布徹的答案:power方法,您可以訪問內部API,這可能是沒有任何必要或者如果你想在宏中(或者在REPL之外的運行時反射中)這樣做的話。

因此,例如,呼籲通過members市民反射API不會提供一個普通的老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))) 

如期望的那樣。我使用運行時反射這裏以簡化的例子,但這種將工作正好與你從你的Context在宏獲得Universe以同樣的方式。

+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

我怎樣才能使它在斯卡拉類工作在編譯的時候? –