Java中`this`运算符的Scala等价物是什么?

时间:2011-03-27 15:40:37

标签: java scala this

在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
}

编辑:哎呀,我觉得我把方法与字段混淆了。

4 个答案:

答案 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中,您自动创建并初始化字段realimaginary,因此在这种情况下,您无需使用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);
}

realimaginary不属于班级。

但是如果你使用构造函数参数 构造函数,它们会被添加为私有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)
}