< 返回版块

leslieDD 发表于 2021-05-24 16:44

    let v = vec![1,2,3,4];
    let v2 = v[2];
    let f = move || {
        drop(v2);
    };
    f();
    println!("{}", v[2]);

输出结果是:

3

疑问:v[2]不是被转移所有权了吗,而且v的内容都在堆上,下面怎么还可以正常打印v[2]的值呢

评论区

写评论
苦瓜小仔 2021-05-24 17:08

此外,你还要知道 Vec 具有 Index trait

container[index] is actually syntactic sugar for *container.index(index), but only when used as an immutable value. If a mutable value is requested, IndexMut is used instead. This allows nice things such as let value = v[index] if the type of value implements Copy.

--
👇
leslieDD: 基本类型都有Copy,无论数据是在栈上还是在堆上

--
👇
ZIP97: 自己去标准库看 Copy trait 、Clone trait、Drop trait

苦瓜小仔 2021-05-24 17:05

具有 Copy 语义的类型不会被 move

👇
leslieDD: 基本类型都有Copy,无论数据是在栈上还是在堆上

--
👇
ZIP97: 自己去标准库看 Copy trait 、Clone trait、Drop trait

Aya0wind 2021-05-24 16:56

i32实现了Copy,那个let v2=v[2]应该是复制而不是转移所有权。

作者 leslieDD 2021-05-24 16:55

基本类型都有Copy,无论数据是在栈上还是在堆上

--
👇
ZIP97: 自己去标准库看 Copy trait 、Clone trait、Drop trait

苦瓜小仔 2021-05-24 16:48

自己去标准库看 Copy trait 、Clone trait、Drop trait

1 共 5 条评论, 1 页