Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala getter/setter作为宏_Scala_Macros_Getter Setter_Scala Macros - Fatal编程技术网

Scala getter/setter作为宏

Scala getter/setter作为宏,scala,macros,getter-setter,scala-macros,Scala,Macros,Getter Setter,Scala Macros,我无法将setter和getter方法实现为宏。以下是一个例子: 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 fini

我无法将setter和getter方法实现为宏。以下是一个例子:

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 = "???"
                ^
欢迎使用Scala 2.10.2版(Java HotSpot(TM)64位服务器虚拟机,Java 1.7.025)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
导入scala.reflect.macros.Context
导入scala.language.experimental.macros
对象值宏{
def getValueImpl[T](c:Context):c.Expr[T]={
导入c.universe_
c、 Expr[T](Apply(选择(c.prefix.tree,newTermName(“getVal”)),Nil))
}
def setValueImpl[T](c:Context)(值:c.Expr[T]):c.Expr[Unit]={
导入c.universe_
c、 Expr[Unit](应用(选择(c.prefix.tree,newTermName(“setVal”)),列表(value.tree)))
}
}
对象模块{
def setVal(值:字符串):单位=???
def getVal():字符串=???
def value:String=macro-ValueMacro.getValueImpl[String]
def值=(值:字符串):单位=宏值宏。setValueImpl[字符串]
}
//正在退出粘贴模式,现在正在解释。
导入scala.reflect.macros.Context
导入scala.language.experimental.macros
定义的模块值宏
定义模块
scala>Module.value
scala.NotImplementedError:缺少一个实现
在scala.Predef$.$qmark$qmark$qmark处(Predef.scala:252)
...
位于scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
scala>Module.value=“??”
:11:错误:重新分配到val
Module.value=“??”
^
Getter有效,但setter无效。它会产生奇怪的错误

我无意中注意到了这样的事情。如果模块中缺少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 = "???"
              ^
scala>Module.value
:15:错误:值getVal不是对象模块的成员
模值
^
scala>Module.value=“??”
:17:错误:值getVal不是对象模块的成员
val$ires2=模块值
^
:14:错误:值getVal不是对象模块的成员
Module.value=“??”
^
看起来
Module.value=“?”
未被读取为setter


是我的错吗?如何解决这个问题?

哈哈,这是个不错的问题!我以为我们已经找到了所有这些有趣的宏小错误,但显然我们没有。我代表您创建了一个bug: