Неизменяемость


Предыдущая страница
Следующая страница  

Мы часто используем переменные, значение которых можно изменять, но бывает множество случаев, когда изменяемость не требуется. В таких случаях можно использовать константы или immutable (неизменяемые) переменные. Ниже приводится несколько примеров, где можно использовать неизменяемую переменную.

Свойство неизменяемости позволяет точнго знать, являются ли переменные изменяемыми или нет, гарантируя, что какие бы то ни было операции не изменят значение неизменяемых переменных. Это также снижает риск некоторых типов программных ошибок.

Концепция неизменяемости в D представлена ключевыми словами const и immutable. Хотя эти два слова близки по смыслу, их обязанности в программах различны, и иногда они являются несовместимыми.

Типы неизменяемых переменных в D

Существует три типа определения переменных, которые никогда нельзя будет изменять.

Константы enum в D

Константы, объявленные как перечисления (enum), позволяют связывать константные значения со значимыми именами во время компиляции. Ниже приведен простой пример.

Пример

import std.stdio;

enum Day{ 
   Sunday = 1, 
   Monday,
   Tuesday, 
   Wednesday, 
   Thursday, 
   Friday, 
   Saturday 
} 
 
void main() { 
   Day day; 
   day = Day.Sunday;
   
   if (day == Day.Sunday) { 
      writeln("Этот день - воскресенье"); 
   } 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Этот день - воскресенье

Переменные с квалификатором immutable в D

Неизменяемые переменные можно определить во время выполнения программы. Квалификатор immutable просто указывает компилятору, что после инициализации переменная становится неизменной. Ниже приведен простой пример.

Пример

import std.stdio; 
import std.random; 
 
void main() { 
   int min = 1; 
   int max = 10; 
   
   immutable number = uniform(min, max + 1); 
   // невозможно изменить переменную number 
   // number = 34; // приведёт к ошибке компиляции
   typeof(number) value = 100;  
   
   writeln(typeof(number).stringof, number); 
   writeln(typeof(value).stringof, value); 
}

Когда вы скомпилируете и выполните эту программу, её результат будет похож на следующий:

immutable(int)4 
immutable(int)100

В приведенном выше примере вы можете видеть, как можно переносить тип данных на другую переменную и использовать stringof при выводе на экран.

Переменные с квалификатором const в D

Константные переменные нельзя изменять аналогично неизменяемым. Неизменяемые переменные можно передавать в функции в качестве их неизменяемых параметров, и поэтому рекомендуется использовать immutable вместо const. Тот же пример, что был использован ранее, ниже модифицирован для const.

Пример

import std.stdio; 
import std.random; 
 
void main() { 
   int min = 1; 
   int max = 10; 
   
   const number = uniform(min, max + 1); 
   // невозможно изменить переменную number 
   // number = 34; // приведёт к ошибке компиляции
   typeof(number) value = 100; 
   
   writeln(typeof(number).stringof, number); 
   writeln(typeof(value).stringof, value); 
}

Когда вы скомпилируете и выполните эту программу, её результат будет похож на следующий:

const(int)7 
const(int)100

Неизменяемые параметры в D

const стирает информацию о том, является ли исходная переменная изменяемой или неизменяемой, а использование immutable выполняет передачу её другим функциям с сохранением первоначального квалификатора. Ниже приведен простой пример.

Example

import std.stdio; 
 
void print(immutable int[] array) { 
   foreach (i, element; array) { 
      writefln("%s: %s", i, element); 
   } 
}
  
void main() { 
   immutable int[] array = [ 1, 2 ]; 
   print(array); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

0: 1 
1: 2

Предыдущая страница
Следующая страница