2
setter 및 getter 메서드를 매크로로 구현하는 데 문제가 있습니다. 예를 들면 다음과 같습니다.매크로로 스칼라 getter/setter
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.reflect.macros.Context
import scala.language.experimental.macros
object ValueMacro {
def getValueImpl[T](c: Context): c.Expr[T] = {
import c.universe._
c.Expr[T](Apply(Select(c.prefix.tree, newTermName("getVal")), Nil))
}
def setValueImpl[T](c: Context)(value: c.Expr[T]): c.Expr[Unit] = {
import c.universe._
c.Expr[Unit](Apply(Select(c.prefix.tree, newTermName("setVal")), List(value.tree)))
}
}
object Module {
def setVal(value: String): Unit = ???
def getVal(): String = ???
def value: String = macro ValueMacro.getValueImpl[String]
def value_=(value: String): Unit = macro ValueMacro.setValueImpl[String]
}
// Exiting paste mode, now interpreting.
import scala.reflect.macros.Context
import scala.language.experimental.macros
defined module ValueMacro
defined module Module
scala> Module.value
scala.NotImplementedError: an implementation is missing
at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252)
...
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
scala> Module.value = "???"
<console>:11: error: reassignment to val
Module.value = "???"
^
게터는 작동하지만 설정하지는 않습니다. 이상한 오류가 발생합니다.
우연히 나는 그런 것을 알아 차렸습니다. GETVAL()는 다음 모듈에 존재하지 않을 경우
scala> Module.value
<console>:15: error: value getVal is not a member of object Module
Module.value
^
scala> Module.value = "???"
<console>:17: error: value getVal is not a member of object Module
val $ires2 = Module.value
^
<console>:14: error: value getVal is not a member of object Module
Module.value = "???"
^
는 Module.value = "???"
처럼 세터과 같이되지 않았다 보인다.
내 실수는 있습니까? 이 문제를 해결하는 방법?
수정 사항 제출 : https://github.com/scala/scala/pull/2689 –