2

次のコードがあります(カットダウンの例として):

class Item {
   attributes: ~mut [~str];
}

class ItemList {
   items: ~mut [ ~Item ];
}

fn read_item(rdr : Reader) -> ~mut Item {
}

fn load_item_list(rdr : Reader) -> ~mut ItemList {
}

"unresolved name ItemList"これらの関数を実装しようとすると、ポインター/可変タイプ ( &~mutvs~mutなど)間の競合やエラーが発生し続けます。

誰かが空のオブジェクトを割り当てて返すだけのカットダウンの例を教えてもらえますか? そこから、データを入力できるはずです。

4

1 に答える 1

2

あなたがどのような問題を抱えているのかはわかりませんが、ここにいくつかの指針があります。まず、Rustトランクに移動することをお勧めしclassます。使用している構文は、かなり古いバージョンのRustを示しています。トランク上でmutは、所有されている型の内部の有効な修飾子ではなくなりました。つまり、を~mut T書くことも、を書くこともできませんstruct { mut field: T }。代わりに、所有されている型の可変性は、スタック内のルートを介して継承されます。したがって、を持っている場合type Foo = ~[~str]、その型はで宣言されたときに完全に不変であり、で宣言されたときlet foo = ~[~"bar"]に完全に変更可能let mut foo = ~[~"bar"]です。

タイプに基づいた例を次に示します。

struct Item {
    attributes: ~[~str]
}

struct ItemList {
    items: ~[ ~Item ]
}

fn read_item() -> ~Item {
    ~Item {
        attributes: ~[~"puppies"]
    }
}

fn load_item_list() -> ~ItemList {
    ~ItemList {
        items: ~[read_item()]
    }
}

fn main() {
    let mut my_items = load_item_list();

    my_items.items[0].attributes[0] = ~"kitties";
}

タイプは可変性についてまったく言及していないことがわかりますが、可変スロット(let mut my_items)にロードするため、内部ベクトルの値を変更できます。

これには慣れるまでに時間がかかる場合がありますが、Rustはこの方法で内部の可変性を処理して、借用したポインターに関連する潜在的に混乱するエラーを回避します。

この継承された可変性の例外は、マネージドタイプの場合です。これは、のように、可変性のルートになることもあります@mut T

于 2013-03-24T00:13:08.360 に答える