Motoko の各アクタは内部的に可変な状態を使いますが, それを 直接共有する ことは決してありません.

Each actor in Motoko may use, but may never directly share, internal mutable state.

後ほど アクタ間での共有 を議論しますが, アクタは不変データを送受し, 互いの外部のエントリ・ポイント (それが 共有可能関数 として働く) を扱います. 共有可能なデータを扱う他の多くの場合とは異なり, Motoko の設計の変わらぬ重要点は *可変なデータ はそのデータを割り付けたアクタの内部に留め置かれ (プライベート), **決して遠隔から共有されることはない *** ということです.

Later, we discuss sharing among actors, where actors send and receive immutable data, and also handles to each others external entry points, which serve as shareable functions. Unlike those cases of shareable data, a key Motoko design invariant is that mutable data is kept internal (private) to the actor that allocates it, and is never shared remotely.

この章では最小限の例題を使って, アクタの (プライベートな) 状態をどうやって取り入れるか, 時間が経つにつれて変化させる変更演算をどう使うかを示します.

In this chapter, we continue using minimal examples to show how to introduce (private) actor state, and use mutation operations to change it over time.

ローカルなオブジェクトとクラス では, ローカル・オブジェクトの構文と, ひとつの可変変数を持つだけの最小の counter アクタを紹介します. 続く章 では, 同じ振る舞いを持ちながら, 対応するサービス・インタフェイス越しに遠隔から間接的に counter 変数にアクセスできるようにします.

In local objects and classes, we introduce the syntax for local objects, and a minimal counter actor with a single mutable variable. In the following chapter, we show an actor with the same behavior, exposing the counter variable indirectly behind an associated service interface for using it remotely.

Immutable versus mutable variables

宣言ブロックの var 構文は, 可変な変数を宣言します:

The var syntax declares mutable variables in a declaration block:

let text  : Text = "abc";
let num  : Nat = 30;

var pair : (Text, Nat) = (text, num);
var text2 : Text = text;

上の宣言リストでは, 四つの変数を宣言しています. 最初の二つの変数 (textnum) は静的スコープで, 不変な変数です. 後の二つの変数 (pairtext2) は静的スコープですが, 可変 な変数です.

The declaration list above declares four variables. The first two variables (text and num) are lexically-scoped, immutable variables. The final two variables (pair and text2) are lexically-scoped, mutable variables.

Assignment to mutable memory

可変変数には代入ができますが, 不変変数には代入はできません.

Mutable variables permit assignment, and immutable variables do not.

上で textnum の両方に新しい値を代入しようとすると, 「この変数は不変である」であるという静的な型エラーになります.

If we try to assign new values to either text or num above, we will get static type errors; these variables are immutable.

でも, 可変変数である pairtext2 に下で := と書いたような代入構文で値を代入して変更するのは問題ありません:

However, we may freely update the value of mutable variables pair and text2 using the syntax for assignment, written as :=, as follows:

text2 := text2 # "xyz";
pair := (text2, pair.1);
pair

上では, 各変数を現在の値に対する単純な「更新規則」を適用して変更しました (例えば text2 には最後に文字列定数 "xyz" を付け加える). 同様に, アクタも上と同じ代入構文を使って, 内部の (プライベートな) 可変変数を更新して, 何らかの呼び出しを処理します.

Above, we update each variable based on applying a simple “update rule” to their current values (for example, we update text2 by appending string constant "xyz" to its suffix). Likewise, an actor processes some calls by performing updates on its internal (private) mutable variables, using the same assignment syntax as above.

Special assignment operations

代入演算子 := は汎用的で, どんな型にも使えます.

The assignment operation := is general, and works for all types.

Motoko にはそれ以外に代入と二項演算を組み合わせた, 特殊な代入演算があります. 代入された値は, 代入先の変数の現在の値と, 与えられた被演算子に二項演算を施したものになります.

Motoko also includes special assignment operations that combine assignment with a binary operation. The assigned value uses the binary operation on a given operand and the current contents of the assigned variable.

例えば, 数値は代入と加算を組み合わせることができます:

For example, numbers permit a combination of assignment and addition:

var num2 = 2;
num2 += 40;
num2

二行目の実行後, 変数 num2 は (ご期待通り) 42 になります.

After the second line, the variable num2 holds 42, as one would expect.