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的设定者. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |