scala-macros를 사용하여 주어진 생성자의 매개 변수 이름을 가져 오는 방법이 있습니까?스칼라 - 매크로를 사용하여 생성자 인수 이름을 얻는 방법
감사
이 REPL 성적 증명서 당신이 가야한다scala-macros를 사용하여 주어진 생성자의 매개 변수 이름을 가져 오는 방법이 있습니까?스칼라 - 매크로를 사용하여 생성자 인수 이름을 얻는 방법
감사
이 REPL 성적 증명서 당신이 가야한다주 또는 매크로 (또는 REPL 외부의 런타임 리플렉션에서)에서이 작업을 수행하려는 경우 필요합니다. 하지 않습니다 공공 리플렉션 API에 members
에서 제공하는 평범한 구식 Symbol
에 isConstructor
호출 그래서 예를 들면
작업을-먼저 당신이 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
을 사용하면 정확히 같은 방식으로 작동합니다.
, 나는 희망 : 폴 부처의 대답에 :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)
어떻게하면 컴파일 시간에 scala 클래스에서 작동하게 할 수 있습니까? –
아 - 좋은 지적 : 파워 모드. 내 얼룩을 저장해 주셔서 감사합니다! –