需要有关Scala实例变量的帮助

地理位置:

假定此Java代码:

public class A {
   public A(String g) {
      x += g.length();
   }

   private int x = 0;
}

如果我创建一个A的实例,像这样:

A a = new A("geo");

调用之后,x的值为3。我在Scala代码中做错什么了吗?

class A(val g:String) {
  x += g.length
  var x:Int = 0
}

object x extends Application {
  val x = new A("geo")
  println(x.x)
}

打印为0。我假设当编译器到达时var x:Int = 0,主构造函数的主体已经结束。我错了吗?您还能如何在Scala中声明实例变量(假设我不希望在构造函数中使用实例变量)?

米奇·布莱文斯(Mitch Blevins):

请记住,您的代码会转换为与此类似(但不完全)的内容:

public class A {

  private final String g;
  private int x;

  public A(String g) {
    this.g = g;
    x_$eq(x() + g.length());
    x = 0;
  }

  public void x_$eq(int arg0) {
    x = arg0;
  }

  public int x() {
    return x;
  }

  public String g() {
    return g;
  }
}

但是在(非构造函数)方法中定义的变量被转换为实际的局部变量。

不知道这是否解释了这么多的原因,而是突出了其中的差异之一。


编辑 -将“翻译”从scala更改为java,以使内容更清晰,更准确地表示正在发生的事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章