Что такое эквивалент Scala оператора `this` в Java? - PullRequest
2 голосов
/ 27 марта 2011

В 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 ]

4 голосов
/ 28 марта 2011

Пока никто не ответил прямо на ваш вопрос. Scala-эквивалент оператора Java this является (удивительно!) Оператором Scala this. Вы действительно перепутали методы с полями в своем примере; ваш код будет работать так, как написано, если вы замените def s на val s. Однако, как уже отмечали другие, вам не нужно this здесь.

Кроме того, Scala позволяет вам определять «псевдоним» для this, используя синтаксис явной типизированной самоссылки, который Питер Шмитц продемонстрировал . Псевдоним «self» часто используется, но любой идентификатор действителен.

3 голосов
/ 27 марта 2011

Когда вы пишете

class Complex(real: Double, imaginary: Double)

в Scala вы автоматически создаете и инициализируете поля real и imaginary, поэтому в этом случае вам не нужно использовать this.

2 голосов
/ 27 марта 2011

В этой ситуации (неизменяемые комплексные числа) case-классы - это именно то, что вы хотели бы использовать.Если вы хотите инициализировать другое поле в конструкторе, вы должны сделать это следующим образом:

case class Complex(real: Double, imaginary: Double) {
  val foo = "bar"
}

Теперь все действительные, мнимые и foo являются полями public в Complex.

РЕДАКТИРОВАТЬ ниже -

Используя обычный класс, вы можете сделать параметры конструктора открытыми полями, такими как:

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 не входят в класс.

Но если вы используете параметры конструктора за пределами конструктора, они добавляются как частные значения:

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);
}
1 голос
/ 27 марта 2011

В дополнение к другим ответам: Вы можете указать Явные ссылки с явным типом , например, в случае столкновения идентификаторов.

case class Complex(real: Double, imaginary: Double) { self => 
  def +(real: Double, imaginary: Double) = Complex(self.real + real, self.imaginary + imaginary)
}
...