Skip to main content

Изменяемые / мутабельные состояния

Каждый агент в 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"). Аналогично, актор обрабатывает некоторые вызовы, выполняя обновления своих внутренних (частных) изменяемых переменных, используя тот же синтаксис присваивания, что и выше.

Операции по выполнению специальных заданий