Изменяемые / мутабельные состояния
Каждый агент в Motoko может использовать, но может никогда напрямую не делиться внутренним изменяемым состоянием.
Позже мы обсудим обмен между акторами, когда акторы отправляют и получают неизменяемые данные, а также передают друг другу внешние точки входа, которые служат общими функциями. В отличие от случаев с общими данными, ключевым условием дизайна Motoko является то, что изменяемые данные хранятся внутри (приватно) того актора, который их содержит, и никогда не доступны удаленно.
В этой главе мы продолжим использовать простые примеры, чтобы показать, как вводить (приватное) состояние актора и использовать операции мутации для его изменения.
В локальных объектах и классах мы используем синтаксис для локальных объектов и минимальный актор счетчика с одной изменяемой переменной. В следующей главе мы покажем актора с таким же поведением, раскрывающего переменную счетчика косвенно, через связанный сервисный интерфейс для ее удаленного использования.
Неизменяемые и изменяемые переменные
Синтаксис var объявляет изменяемые переменные в блоке объявления:
let text : Text = "abc";
let num : Nat = 30;
var pair : (Text, Nat) = (text, num);
var text2 : Text = text;
Run:
() : ()
В приведенном выше списке объявлений объявлены четыре переменные. Первые две переменные (text и num) имеет лексическую область видимости с неизменяемыми переменными. Последние две переменные (pair и text2) имеют лексическую область видимости с изменяемыми переменными.
Присвоение изменяемой памяти
Изменяемые переменные допускают присвоение, а неизменяемые - нет.
Если мы попытаемся присвоить новые значения переменным text или num, то получим ошибку статического типа; эти переменные являются неизменяемыми.
Однако мы можем свободно обновлять значения неизменяемых переменных pair и text2, используя синтаксис присваивания, записанный как :=, следующим образом:
text2 := text2 # "xyz";
pair := (text2, pair.1);
pair
Выше мы обновляем каждую переменную на основе применения простого "правила обновления" к их текущим значениям (например, мы обновляем text2, добавляя к его суффиксу строковую константу "xyz"). Аналогично, актор обрабатывает некоторые вызовы, выполняя обновления своих внутренних (частных) изменяемых переменных, используя тот же синтаксис присваивания, что и выше.