加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – private [this] on mutable constructor参数导致意外行

发布时间:2020-12-16 09:00:39 所属栏目:安全 来源:网络整理
导读:参见英文答案 Unexpected difference in behavior seemingly due to using private[this] instead of private????????????????????????????????????1个 当我运行下面的代码时, class A(private[this] var i: Int) { println("i = " + i) i -= 1 println("Aft
参见英文答案 > Unexpected difference in behavior seemingly due to using private[this] instead of private????????????????????????????????????1个
当我运行下面的代码时,

class A(private[this] var i: Int) {
  println("i = " + i)
  i -= 1
  println("After decrement,i = " + i)

  override def toString = i.toString
}
object A extends App {
  val a = new A(1)
  println("a = " + a)
}

我明白了:

i = 1
After decrement,i = 0
a = 1

如果我用private替换private [this],我会得到预期的行为,即最后一行输出变为a = 0.我正在使用IntelliJ 2016.1.2,Scala插件版本3.0.6和scala-sdk-2.11. 8.

解决方法

是的,it’s a bug( SI-6165,SI-6880).

让我们进一步探讨.这是两种情况的反编译代码:

私人[这]:

class A extends Object {
  <paramaccessor> private[this] var i: Int = _;
  override def toString(): String = scala.Int.box(A.this.i).toString();
  def <init>(i: Int): com.yuval.A = {
    A.this.i = i;
    A.super.<init>();
    scala.this.Predef.println("i = ".+(scala.Int.box(i)));
    i = i.-(1);
    scala.this.Predef.println("After decrement,i = ".+(scala.Int.box(i)));
    ()
  }
};

在这里,我们看到var i是为对象创建的,可以直接在代码中访问.我们看到我被分配到A.this.i,这是对该领域的直接分配.之后,变异值被赋值给i,即方法参数,而不是A.this.i,即A类的字段.实际值i被遮蔽.

相反,当我是私人时:

class A extends Object {
  <paramaccessor> private[this] var i: Int = _;
  <accessor> <paramaccessor> private def i(): Int = A.this.i;
  <accessor> <paramaccessor> private def i_=(x$1: Int): Unit = A.this.i = x$1;
  override def toString(): String = scala.Int.box(A.this.i()).toString();
    def <init>(i: Int): com.yuval.A = {
      A.this.i = i;
      A.super.<init>();
      scala.this.Predef.println("i = ".+(scala.Int.box(A.this.i())));
      A.this.i_=(A.this.i().-(1));
      scala.this.Predef.println("After decrement,i = ".+(scala.Int.box(A.this.i())));
      ()
    }
};

在这里,我们看到我有一个getter和setter方法,与private [this]不同.我们还看到减少是在A.this.i_上完成的,这是字段成员A.this.i的设定者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读