Реализация шаблона объекта значения в D

Я хочу реализовать шаблон объекта значения в D. То есть я хочу иметь изменяемые ссылочные переменные на неизменяемые объекты. Tпеременные должны быть назначаемыми, но Tобъекты никогда не должны изменять свое состояние.

Меня смущает разница между constи immutableв D. Позвольте мне проиллюстрировать мои сомнения скелетом Rationalкласса:

class Rational
{
    int num;
    int den;

Должен ли я объявить numи denкак constили immutable? Есть ли разница для целых чисел?

    invariant()
    {
        assert(den > 0);
        assert(gcd(abs(num), den) == 1);
    }

Должен ли я объявить invariantкак constили immutable? Пометка его как immutableприводит к ошибке времени компиляции -, но это может быть связано с тем, что другие элементы не помечены immutable.

    this(int numerator, int denominator) {... }

Должен ли я объявить конструктор как constили immutable? Что бы это значило?

    string toString()
    {
        return std.string.format("(%s / %s)", num, den);
    }
}

Должен ли я объявить toStringкак constили immutable?

Кажется, вместо того, чтобы отмечать отдельных членов, я могу отметить весь класс:

class Rational
const class Rational
immutable class Rational

Что из этого лучше всего подходит для шаблона объекта значения?

Как насчет pure? В шаблоне объекта значения методы не должны иметь побочных эффектов, поэтому имеет ли смысл объявлять каждый член как pure?Пометка toStringкак pureне компилируется, к сожалению, потому что std.string.formatне является чистым; есть ли для этого какая-то особая причина?

Кажется, я также могу объявить сам класс как pure, но это, похоже, не имеет никакого эффекта, потому что компилятор больше не жалуется на то, что toStringвызывает нечистую функцию.

Что же тогда означает объявить класс как pure? Его просто игнорируют?

6
задан fredoverflow 8 August 2012 в 10:29
поделиться