gpt4 book ai didi

rust - "Cannot move out of dereference ` & `-pointer"带向量

转载 作者:行者123 更新时间:2023-11-29 08:11:49 24 4
gpt4 key购买 nike

我现在正在试验 Rust,我真的被各种随机的编译器错误绊倒了,比如这个:

error: cannot move out of dereference of `&`-pointer
return list[idx];
^~~~~~~~~

相关片段转载如下。 list 是一个单词列表,其思想是从列表中返回一个在一定长度内(在 minLength 和 maxLength 之间)的随机单词。因此,我生成了一个随机 uint 并使用模数将其限制为列表的大小。然后我想检查这个词的长度是否正确,如果是则返回它。

显然这不是最有效的方法,但我只是想要一些简单的方法来满足练习的需要。

fn get_a_word(list: Vec<String>, minLength: uint, maxLength: uint) -> String {
loop {
let idx = rand::random::<uint>() % list.len();
if list[idx].len() > minLength && list[idx].len() < maxLength {
return list[idx];
}
}
}

我对这条错误消息的含义做了一些研究,但似乎每个人都说当您处理 Option<T> 时会出现这种情况。 retvals,而不是试图从集合中获取值(value)。

这可能是一个非常简单的问题,但究竟为什么 Rust 不让您从集合/向量/数组中返回一个值?

最佳答案

一次只有一个东西可以拥有一个对象,而你试图在那里做的事情会破坏这个不变量,因为你会在向量和返回位置都有你要返回的字符串。 list[idx]或多或少扩展到 *list.index(idx)对于方法 Index::index (事实上​​它比这更复杂一点,因为它应该是 Index::index 还是 IndexMut::index_mut 是根据上下文确定的,&list[idx] 只是一个直接的 list.index(idx)list[idx].method() 对于 &self -采取method 将是 list.index(idx).method() )。

您有几个选择;这是三个:

  • 从列表中删除值,并返回它。其余Vec<String>你拥有的将被丢弃,因此所有 String除了右边的,最后都会被释放。

    return list.swap_remove(idx).unwrap(); (比较 swap_remove remove ,前者效率更高但改变了在这种情况下完全可以的顺序)代替 return list[idx];会做这个。

  • 克隆字符串。这效率较低,但可以认为是可以接受的。

    return list[idx].clone();会为此做的。

  • 在整个过程中使用切片和引用:这是最有效的方式,通常也是最惯用的方式。它非常高效,因为它不涉及任何分配或解除分配或大值的移动。

    fn get_a_word(list: &[String], min_length: uint, max_length: uint) -> &str {
    loop {
    let idx = rand::random::<uint>() % list.len();
    if list[idx].len() > min_length && list[idx].len() < max_length {
    return list[idx].as_slice();
    }
    }
    }

关于rust - "Cannot move out of dereference ` & `-pointer"带向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com