(日本語訳) Chain Castle – Lesson 2 Chapter 1

Libra
Libra Move言語
スポンサーリンク

Chapter 1 所有権

所有権の使用例

前のチャプタで、バインディングというワードに言及しました。実際には、このワードは「所有権のバインディング」を指します。ある識別子がある値の所有権を持っている場合に限って、私たちはこの識別子を通して値にアクセスできます。

値を名前(識別子)にバインディングするとき、この値(リソース)の所有権を識別子にバインドしています。例えば…

let x: u64;
x = 3;

let記述を通して、型(u64)の数値(3)のリソースを識別子xにバインドするとき、xはこのリソースの所有権を持ち、その間、このリソースの値にアクセスしたり変更したりする排他的所有権を保持し続けます。しかし、一度他の識別子に所有権がうつされた後は、この識別子には値の所有権がなくなります。

所有権の変更

所有権の変更を行うなら、メモリ安全性のためにイコール記号(=)に代わってmove()ファンクションを使わなければなりません。

つまり、Moveにおいては、識別子をイコール記号(=)で繋げられません。それは識別子と値の間でのみ使うことができます。例えば次のコードは正しくありません。

let x: u64;
let y: u64;
x = 3;
y = x; //エラー

所有権の変更がどの様に行われるのか説明するサンプルは次の通りです。

let x: u64;
let y: u64;
let z: u64;
x = 3;
y = move(x); // 3の所有権を識別子xから識別子yに変更
z = move(x); // エラー:今識別子xは所有権が無い、初期化されていない変数なので、move(x)は失敗します。
z = move(y); // 3の所有権がyからzに移ります。
x = 3;  // 再びxを3で初期化します。
z = move(x); // この時点では3の所有権はmove()によって、xからzに変更できます。

所有権のコピー

copy()ファンクションを使って、所有権を変更することなく、ある識別子の値を他の識別子と同じにできます。この場合、識別子はcopy()ファンクションが実行された後でもアクセス可能です。例えば…

let x: u64;
let y: u64;
let z: u64;
x = 3;
y = copy(x); // 3の所有権をxからyにコピー。
z = move(x); // 3の所有権をxからzにムーブ。

プロシージャを呼んでパラメータを渡すとき、パラメータをダイレクトに使うことは許されていないことに注意してください。その代わりにmove(parameter name)あるいはcopy(parameter name)といった関数を使って所有権の変更を行う必要があります。どちらで実装するかはそのパラメータがどの様に使われるかによって異なります。

実習

前のレッスンで、私たちはSerialLimitを定義しました。このチャプタでは、このパラメータの値を10SerialDigitsにセットしたいと思います。SerialLimitを初期化するため10SerialDigitsというそれぞれ二つのパラメータを持つpow()を呼びます。

上記のタスクではpow()プロシージャにパラメータとして値を渡す必要があり、それは所有権の変更を含んでいます。SerialDigitsは後のチャプタでまた使われることを考慮して、ここではcopy()関数を使う様にします。この時点ではpow()関数はまだ定義されていません。これは次のチャプタで実装されるでしょう。

SerialLimitパラメータはmain()プロシージャ内で、前のチャプタで説明したmodule name.function name形式のpow()関数呼び出しによって初期化されます。もし忘れてしまっていたら見直してください。

Move Castle
タイトルとURLをコピーしました