Motoko では, 可変状態は常にアクタにプライベートであることを思い出して下さい.

Recall that in Motoko, mutable state is always private to an actor.

しかし, 二つのアクタはメッセージ・データを共有することはできますし, メッセージがアクタ (自分自身と相手) を参照することもできます. さらにメッセージは個々の関数も参照できます (shared 関数ならば) .

However, two actors can share message data, and those messages can refer to actors, including themselves and one another. Additionally, messages can refer to individual functions, if those functions are shared.

このような機構を通じて, 二つのアクタの非同期メッセージ交換による振る舞いの協調が可能になります.

Through these mechanisms, two actors can coordinate their behavior through asynchronous message passing.

Publisher-subscriber pattern with actors

この節の例題では, 公開-購読パタン のさまざまな変種に焦点を当てて, アクタがどうやって関数を共有するのかを説明します. 公開-購読パタンでは, 公開 アクタが 購読 アクタのリストを記録し, 公開者の状態に注目すべき何かが起きたときにはそのリストのアクタに通知します. 例えば, 公開アクタが新しい投稿を公開したら, 購読アクタは新しい投稿があったことを知らされます

The examples in this section illustrate how actors share their functions by focusing on variations of the publish-subscribe pattern. In the publish-subscribe pattern, a publishing actor records a list of subscriber actors to notify when something notable occurs in the publisher’s state. For example, if the publisher actor publishes a new article, the subscriber actors are notified that a new article is available.

下の例題は Motoko の二つのアクタを使って, 公開者と購読者の関係の変種を作成します.

The example below uses two actors in Motoko to build variations of the publisher-subscriber relationship.

このパタンを使って動いているプロジェクトの完全なコードは, examples repository にある [pubsub](https://github.com/dfinity/examples/tree/master/motoko/pubsub の例を見てください.

To see the complete code for a working project that uses this pattern, see the pubsub example in the examples repository.

Subscriber actor

下の Subscriber アクタ型は, 購読側アクタと公開側アクタのそれぞれ公開と呼び出しのインタフェイスとして考えられるものです.

The following Subscriber actor type provides a possible interface for the subscriber actor and the publisher actor to expose and to call, respectively:

type Subscriber = actor {
  notify : () -> ()
};

副型付けをすれば, Subscriber アクタはこの型定義には含まれていないようなメソッドでも追加して入れられることを付記しておきます.

Note that sub-typing enables the Subscriber actor to include additional methods that are not listed in this type definition.

簡単にするために, notify 関数は関連する通知データを受け付け, 購読者側の何らかの新しい状態メッセージを公開者側に返すものとします. 例えば, 購読者側は通知データに基づいて, 購読の設定の変更を返したりするかもしれません.

For simplicity, assume that the notify function accepts relevant notification data and returns some new status message about the subscriber to the publisher. For example, the subscriber might return a change to its subscription settings based on the notification data.

Publisher actor

コードの公開者側では, 購読者の配列を保存します. 簡単にするために, 各購読者は一度 subscribe 関数を使ったら購読に登録されると言うことにします.

The publisher side of the code stores an array of subscribers. For simplicity, assume that each subscriber only subscribes itself once using a subscribe function.

import Array "mo:base/Array";

actor Publisher {
    var subs: [Subscriber] = [];

    public func subscribe(sub: Subscriber) {
        subs := Array.append<Subscriber>(subs, [sub]);
    };

    public func publish() {
        for (sub in subs.vals()) {
          sub.notify();
        };
    };
};

この後, 何らかの不特定の外部エージェントが publish 関数を起動すると, 購読者全員に上の Subscriber 型で定義したとおり notify メッセージが届くことになります.

Later, when some unspecified external agent invokes the publish function, all of the subscribers receive the notify message, as defined in the Subscriber type given above.

Subscriber methods

もっとも単純な場合には, 購読者アクタは以下のメソッドを持ちます:

In the simplest case, the subscriber actor has the following methods:

次のコードはこれらのメソッドを実装したものです:

The following code illustrates implementing these methods: