viewでコピーせずに読む
viewは、文字列や配列の中身を借りて読むための値です。元のデータをコピーせず、所有権も移しません。元のデータが使える間だけ利用できます。
def main() -> Result[unit, Error]:
text = "Nagi language"
borrowed = view(text)
first = try slice(borrowed, 0, 4)
print(first)
saved = copy(first)
print(saved)
return ok(print(text))
view.nagiとして保存し、nagic run view.nagiで実行すると、Nagi、Nagi、Nagi languageを表示します。firstは元の文字列の一部を借りています。savedはcopyで作った別の所有文字列です。
このページの目次
一部を借りる
slice(view(data), start, end)は、start以上end未満の範囲を借ります。文字列では位置をUTF-8のバイト数で指定します。範囲外や文字の途中を指定すると、Resultのエラーになります。
保存するviewは、上の例のように、先に元の値を変数へ入れてから作ってください。借りた値を使っている間は、元の値の変更や移動にも制約があります。所有権に具体例があります。
saved = view("Nagi")は、一時的な文字列を借りて保存するためエラーです。print(view("Nagi"))のように、その呼び出しの中で使い終える場合は使えます。
配列のcopyには、要素がRustのCloneに対応している必要があります。生成されるclassではCopy classにだけCloneも付きます。所有strを持つclassなどを配列ごと複製するには、現在はRustアダプターでCloneを実装します。この実装の有無はbuildで確認します。
関数から返す
入力のviewをそのまま返したり、その一部を返したりできます。
def identity(data: view[str]) -> view[str]:
return data
関数の中で作った文字列を借りて返すことはできません。関数が終わると元のデータがなくなるためです。長く保持したいデータは所有値として返します。classへのviewの保存や、別のtaskへviewを渡すことは未対応です。
HTTPのbody: view[bytes]も受信データを借ります。viewを作るための追加コピーはありませんが、ネットワークからの受信やJSONの読み込みには別の処理が必要です。測定方法は性能の読み方を参照してください。