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 会为您生成 getters
、equals
和 toString
。
你可以编译这个class
scalac Charge.scala
javap -c Charge.class
然后看看它生成了什么
我收到一个编译错误:
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 会为您生成getters
、equals
和toString
。 你可以编译这个classscalac Charge.scala
javap -c Charge.class
然后看看它生成了什么