【问题标题】:private[this] Vs giving parameters without val/var in scalaprivate[this] Vs 在 scala 中给出没有 val/var 的参数
【发布时间】:2021-02-14 05:29:15
【问题描述】:

我了解在类中将 val/var 标记为 private[this] 并提供不带 val/var 的类参数是相同的。

 class ABC (x:Int){..}

 class ABC {
   private[this] x:Int = 100
 }

在这两种情况下,x 只能被同一个对象的构造函数和方法访问。我的理解正确吗?

谢谢!

【问题讨论】:

    标签: scala this field access-modifiers modifier


    【解决方案1】:

    两者

    import scala.reflect.runtime.universe._
    
    reify{
      class ABC(x: Int)
    }.tree
    

    reify {
      class ABC(private[this] val x: Int)
    }.tree
    

    生产

    {
      class ABC extends AnyRef {
        <paramaccessor> private[this] val x: Int = _;
        def <init>(x: Int) = {
          super.<init>();
          ()
        }
      };
      ()
    }
    

    reify{
      class ABC {
        private[this] val x: Int = 100
      }
    }.tree
    

    生产

    {
      class ABC extends AnyRef {
        def <init>() = {
          super.<init>();
          ()
        };
        private[this] val x: Int = 100
      };
      ()
    }
    

    所以你的问题的答案

    在这两种情况下,x 只能被同一个对象的构造函数和方法访问。

    是积极的。

    您可以检查 class ABC(x: Int) 确实创建了一个 (private[this]) 字段,以验证您可以使用 this 访问它

    class ABC(x: Int) {
      this.x
    }
    

    但需要强调的是,Scala 规范并没有指定class ABC(x: Int) 中的x 字段或不是 字段。这只是 Scalac 和 Dotty 编译器的当前行为。

    Get the property of parent class in case classes

    Disambiguate constructor parameter with same name as class field of superclass

    Do scala constructor parameters default to private val?

    Scala Constructor Parameters

    我了解在类中将 val/var 标记为 private[this] 并提供不带 val/var 的类参数是相同的。

    嗯,这不一样,因为class ABC(x: Int) 你有一个接受Int 的构造函数。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2011-05-20
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2011-05-25
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多