在Java中,我通常以这种方式初始化构造函数中的字段:
private double real;
private double imaginary;
public Complex(double real, double imaginary) {
this.real = real;
this.imaginary = imaginary;
}
有没有办法在Scala中为类或对象执行相同的操作?而不是
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
}
类似的东西:
class Complex(real: Double, imaginary: Double) {
def this.real = real
def this.imaginary = imaginary
}
编辑:哎呀,我觉得我把方法与字段混淆了。
答案 0 :(得分:4)
到目前为止,没有人直接回答你的问题。 Scala this
运算符的Scala等价物是(惊奇!)Scala this
运算符。您确实将方法与示例中的字段混淆了;如果用def
替换了val
s,您的代码将按照书面形式运行。但是,正如其他人所指出的那样,这里不需要this
。
此外,Scala允许您使用Peter Schmitz demonstrated的显式类型自引用语法为this
定义“别名”。别名“self”经常被使用,但任何标识符都有效。
答案 1 :(得分:3)
写作时
class Complex(real: Double, imaginary: Double)
在Scala中,您自动创建并初始化字段real
和imaginary
,因此在这种情况下,您无需使用this
。
答案 2 :(得分:2)
对于这种情况(不可变复数),case类正是您想要使用的。如果你想在构造函数中初始化另一个字段,你可以这样做:
case class Complex(real: Double, imaginary: Double) {
val foo = "bar"
}
现在,real,imaginary和foo都是Complex中的 public 字段。
以下编辑 -
使用常规类可以使构造函数参数公共字段如下:
class Complex(val real: Double, val imaginary: Double)
class MutableComplex(var real: Double, var imaginary: Double)
以下是我不知道的有趣内容:
class Complex(real: Double, imaginary: Double) {
println(real + " + " + imaginary + "i")
}
% javap -private Complex
public class Complex extends java.lang.Object implements scala.ScalaObject{
public Complex(double, double);
}
real
和imaginary
不属于班级。
但是如果你使用构造函数参数 构造函数,它们会被添加为私有val:
class Complex(real: Double, imaginary: Double) {
override def toString = real + " + " + imaginary + "i"
}
% javap -private Complex
public class Complex extends java.lang.Object implements scala.ScalaObject{
private final double real;
private final double imaginary;
public java.lang.String toString();
public Complex(double, double);
}
答案 3 :(得分:1)
除了其他答案:您可以指定Explicitly Typed Self References,例如在标识符冲突的情况下。
case class Complex(real: Double, imaginary: Double) { self =>
def +(real: Double, imaginary: Double) = Complex(self.real + real, self.imaginary + imaginary)
}