2012-12-11 4 views

답변

5

주 또는 매크로 (또는 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))) 

원하는대로 다음은 더 나은 솔루션입니다. 예를 단순화하기 위해 여기에 런타임 리플렉션을 사용했지만, 매크로에서 ContextUniverse을 사용하면 정확히 같은 방식으로 작동합니다.

+0

아 - 좋은 지적 : 파워 모드. 내 얼룩을 저장해 주셔서 감사합니다! –

1

, 나는 희망 : 폴 부처의 대답에 :power 접근 방식은 당신이 아마 하나 필요하지 않습니다 내부 API에 대한 액세스를 제공하는 것이

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 클래스에서 작동하게 할 수 있습니까? –

관련 문제