scala - 为什么这个公共(public)字段有一个 PRIVATE 标志?

标签 scala scala-macros scala-reflect scala-macro-paradise

我正在编写 Scala 宏并遍历树以查找类中的非私有(private)字段。

考虑宏查看的这段代码:

class Foo {
  val bar: String = "test"
}

我正在遍历这段代码并到达 barValDef。它的修饰符中只有两个标志:Flag.PRIVATEFlag.LOCAL

bar 上使用 private 修饰符没有任何改变。使用 protected 修饰符只会将 Flag.PROTECTED 添加到标志列表中。

我错过了什么?如何区分私有(private)字段和公共(public)字段?

编辑:

以下代码:

val bar: String = "test"

既没有 Flag.PRIVATE 也没有 Flag.LOCAL,这是有道理的,因为它是一个“全局”公共(public) val。

我在里面工作的上下文正在为 wartremover 写一个新的疣,当扩展宏并遍历代码块时,它只是从上下文的 universe 中获取一个 Traverser

最佳答案

Scala 中的 val 定义扩展为带有附加 getter 的 private[this] 字段。除了您看到的 ValDef 之外,应该还有一个具有相同名称的附加 DefDef 方法定义,它是字段上的 getter。

关于scala - 为什么这个公共(public)字段有一个 PRIVATE 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169697/

相关文章:

xml - 如何使用 Scala 创建 xhtml 查询字符串?

scala - 将 Spark 数据帧写入现有的 Parquet Hive 表中

scala - 如何在 Scala 宏中获取更高级类型参数的树

java - Scala 反射在运行时使用方法的返回类型进行强制转换

scala - 没有适用于案例类别类型的 TypeTag

scala - slick 2.0 定义通用 `find by field` 方法

Scalatest:应该是带有额外描述的匹配器吗?

基于 Scala 约束的类型和文字

scala - 访问案例类注释