TermSymbol.isVal看起来不正确

时间:2017-08-19 02:33:14

标签: scala

我有以下代码来检查A类中的x是否为val或var

import scala.reflect.runtime.universe._
class A {
  val x = 10
}

val y: Symbol = typeOf[A].member(TermName("x"))
println(y.asTerm.isVal + "," + y.asTerm.isVar)
println()

输出结果为:

false,false

x被声明为val,我会问为什么y.asTerm.isVal被评估为false

1 个答案:

答案 0 :(得分:2)

如果你这样做,你可以得到一个提示:

browserHistory.listen((location, action) => {
    console.log('location change:', location, action);
})

有两个typeOf[A].decls // List everything inside A SynchronizedOps(constructor A, value x, value x) ,因为value x有两种形式。记住Scala的统一访问原则:公共x永远不会真正公开。相反,它们是val与生成的getter private[this] val相结合。列表中的一个defvalue x,另一个是private[this] val x(Scala无效,但就是这样)。您可以使用def x = x定义该类以查看它。

然后,

-Xprint:typer返回公开typeOf[A].member(TermName("x")),而不是返回def x。您可以(从最少到最具体)private[this] val x / y.asTerm.isMethod / .isAccessor进行验证。

如果您只需要获取该字段的设置者,则可以致电.isGetter,如果y.asTerm.setterdef x_=,则会返回x,并返回{ {1}}如果没有setter。如果您需要字段本身,可以拨打var,这实际上是NoSymboly.asTerm.accessed.asTerm