Конфликт имен членов класса Scala и параметров конструктора

Рассмотрим следующий класс, написанный на Java:

class NonNegativeDouble {
    private final double value;
    public NonNegativeDouble(double value) {
        this.value = Math.abs(value);
    }
    public double getValue() { return value; }
}

Он определяет последнее поле с именем value , которое инициализируется в конструкторе, взяв его параметр с одинаковым именем и применив к нему функцию. .

Я хочу написать что-то подобное на Scala. Сначала я попробовал:

class NonNegativeDouble(value: Double) {
  def value = Math.abs(value)
}

Но компилятор жалуется: ошибка: значение перегруженного метода требует типа результата

Очевидно, компилятор считает, что выражение value внутри выражения Math.abs (value) относится к определяемому методу. Следовательно, определяемый метод является рекурсивным, поэтому мне нужно указать его возвращаемый тип. Итак, написанный мной код не выполняет то, что я ожидал: я хотел value внутри Math.abs (value) , чтобы ссылаться на параметр конструктора value , а не определяемому методу. Это как если бы компилятор неявно добавил this. в Math.abs (this.value) .

Добавление val или var (или частных ... вариантов) в параметр конструктора не Кажется, это помогает.

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

Спасибо!

20
задан Bruno Reis 22 September 2010 в 01:01
поделиться