Следующий код взят из книги «Программирование в Scala» Мартина Одерски и др. который определяет рациональный тип:Можно ли определить локатор-конструктор в Scala?
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numer = n/g
val denom = d/g
...
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
Здесь значение г используется только, когда неявный конструктор инициализирует поля NUMER и DENOM. Предположим, программист знает, что его нельзя использовать нигде. В приведенном выше случае он по-прежнему доступен после построения объекта Rational. Это означает, что он также будет занимать пространство, поскольку является частным полем, а не локальной переменной для конструктора.
Мой вопрос: как изменить этот код так, чтобы g
использовался только при строительстве, а затем выброшен?
Это одна из тех «нехоровых точек» в Скале. Представьте себе, что если данный объект-конструктор использовался только для извлечения какой-то произвольной информации: если бы он навсегда оставил бы его недоступным для рекультивации, даже если бы требовалось лишь небольшое подмножество информации. Я думаю, что есть синтаксис «pre-class body», но я не могу вспомнить, что это такое. –
@pst Спасибо за это быстрое редактирование. Я делал это между тем. Но ты выглядишь лучше. :) – ciuncan
Если у кого-то есть ссылки на этот синтаксис «пред-класс тела», о котором упоминает pst, мне было бы интересно услышать об этом. –