gpt4 book ai didi

scala - 为什么 Scala 案例类字段不反射(reflect)为公共(public)的?

转载 作者:行者123 更新时间:2023-12-04 13:40:50 24 4
gpt4 key购买 nike

我一直将案例类的构造函数参数理解为定义公共(public) val。

但是,当我反射(reflect)字段时,isPublic 方法出现错误。任何想法为什么?

scala> class Test( val name : String, val num : Int )
defined class Test

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> val tpe = typeOf[Test]
tpe: reflect.runtime.universe.Type = Test

scala> def checkValVisibility( t : Type ) = {
| t.members
| .filter( _.isTerm )
| .map( _.asTerm )
| .filter( _.isVal )
| .map( memb => "Val " + memb.name.toString.trim + " is public? " + memb.isPublic )
| .mkString("\n")
| }
checkValVisibility: (t: reflect.runtime.universe.Type)String

scala> checkValVisibility( tpe )
res2: String =
Val num is public? false
Val name is public? false

最佳答案

原因是您查询的实际值 numname确实是私有(private)的。对于案例类(和具有公共(public)类参数的类),类参数被实现为具有公共(public)访问器(自动为您生成)的私有(private)字段。

如果你想使用 Scala 反射来获得一个符号,代表给定字段的公共(public)访问器,你可以简单地做:

scala> tpe.member("name": TermName)
res02: reflect.runtime.universe.Symbol = value name

如果你这样做,你可以看到它是一个公共(public)访问器:
scala> tpe.member("name": TermName).isPublic
res03: Boolean = true

scala> tpe.member("name": TermName).isMethod
res04: Boolean = true

在您的情况下,您过滤掉了访问者,只留下了实际的(私有(private))字段。您可以通过检查 isAccessor 从上面更改您的代码以实现您想要的。 (或 isGetter )而不是 isVal .
scala> def checkValVisibility( t : Type ) = {
| t.members
| .filter( _.isTerm )
| .map( _.asTerm )
| .filter( _.isAccessor )
| .map( memb => "Val " + memb.name.toString.trim + " is public? " + memb.isPublic )
| .mkString("\n")
| }
checkValVisibility: (t: reflect.runtime.universe.Type)String

scala> checkValVisibility(tpe)
res05: String =
Val num is public? true
Val name is public? true

关于scala - 为什么 Scala 案例类字段不反射(reflect)为公共(public)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15730155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com