请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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 不再拥有这个元素的所有权。当然如果这样子实现的话会很怪异,我只是有点好奇。还是说有什么内置的规则顺序呢?

正在回答 回答被采纳积分+3

2回答

叶枭 2021-12-08 11:40:14

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

0 回复 有任何疑惑可以回复我~
叶枭 2021-12-01 10:50:33

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

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


0 回复 有任何疑惑可以回复我~
  • 提问者 小学生6年级 #1
    感觉不能这样理解把。那我就算不迭代。单纯的取数再返回也是有问题的。我外面也没去对这个 list 做遍历。
    ```
    fn largest<T: PartialOrd>(list: &[T]) -> T {
        let largest = list[0];
    
        largest
    }
    ```
    感觉这像是内置的规则?
    回复 有任何疑惑可以回复我~ 2021-12-01 21:22:49
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信