看 rust 文档遇到的一个所有权问题

来源:7-2 Rust中的所有权

小学生6年级

2021-12-01

fn largest<T: PartialOrd>(list: &[T]) -> T {
    let mut largest = list[0];

    for &item in list.iter() {
        if item > largest {
            largest = item;
        }
    }

    largest
}

其中一个报错就是

error[E0508]: cannot move out of type `[T]`, a non-copy slice
 --> src/main.rs:2:23
  |
2 |     let mut largest = list[0];
  |                       ^^^^^^^
  |                       |
  |                       cannot move out of here
  |                       help: consider using a reference instead: `&list[0]`

我的问题就是,为什么这里会期望用 move 语义,而不是简单的所有权变更呢? 例如 largest 直接获取到了列表第一个元素的所有权。list 不再拥有这个元素的所有权。当然如果这样子实现的话会很怪异,我只是有点好奇。还是说有什么内置的规则顺序呢?

写回答

2回答

叶枭

2021-12-08

在原始列表还存在的时候, 你不能从列表中拿走一个元素的所有权, 因为这个元素的所有者是这个列表. 只有一种情况可以从列表拿走元素的所有权, 就是在你拿走元素后列表不再被使用.

0
0

叶枭

2021-12-01

let mut largest = list[0]; 获得所有权后, 下一步的代码是 for &item in list.iter() {;

list 已经不拥有第一个元素的所有权了, 因此你不能再对 list 进行迭代.


0
1
小学生6年级
感觉不能这样理解把。那我就算不迭代。单纯的取数再返回也是有问题的。我外面也没去对这个 list 做遍历。 ``` fn largest(list: &[T]) -> T { let largest = list[0]; largest } ``` 感觉这像是内置的规则?
2021-12-01
共1条回复

轻松实现Rust系统入门,实战编译器开发

入门者的平缓学习曲线,聚焦Rust核心重难点,获得实际应用能力

442 学习 · 45 问题

查看课程