Docsの目次

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の読み込みには別の処理が必要です。測定方法は性能の読み方を参照してください。

Nagi 0.1のドキュメントこのページのソース