Scala compile error: member of method parameter not visible to class method

Scala compile error: member of method parameter not visible to class method

我收到一个编译错误:

value txn is not a member of Charge
new Charge(this.txn + that.txn)
                           ^

使用以下 Scala class 定义:

class Charge(txn: Double = 0){
  def combine(that:Charge): Charge = 
    new Charge(this.txn + that.txn)
}

明确声明 txn 为 val 允许它工作:

class Charge(val txn: Double = 0){
  def combine(that:Charge): Charge = 
    new Charge(this.txn + that.txn)
}

我以为 val 是假设的?有人可以解释一下吗?是不是我对默认构造函数或方法作用域的理解有问题?

传递给构造函数的本质上是构造函数参数,其范围仅限于构造函数。如果要使它们从外部可见,则必须将它们声明为 vals 或在构造函数主体中重新分配给其他一些 vals。

在scala中,你可以定义两种形式的classes,例如

  • class Charge(txn: Double) -> 在这种情况下,scala 编译器将其编译为 java,如下所示
public class Charge {
  ....
  public Charge combine(Charge);
  ....
  public Charge(double);
  ....
}

正如您在编译后的 java 代码中注意到的那样,txn 没有 public 访问器 让我们看看 Charge class 的另一种变体, 如果你这样定义 class Charge(val txn: String),它会被编译成下面的

public class Charge {

  ...
  public double txn();
  ...  
  public Charge combine(Charge);
  ...
  public Charge(double);
  ...
}

如您所见,在这种情况下,编译器为 txn 生成 public 访问器,因此当您将其标记为 val[= 时,您可以访问 that.txn 26=]

  • case class Charge(txn: Double):这是数据 class,scala 会为您生成 gettersequalstoString。 你可以编译这个class

  • scalac Charge.scala

  • javap -c Charge.class 然后看看它生成了什么