首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用锈蚀中的“查找”对项的可变引用

使用锈蚀中的“查找”对项的可变引用
EN

Stack Overflow用户
提问于 2018-01-31 20:36:36
回答 1查看 3.2K关注 0票数 18

如何获得向量中找到的项的可变引用?

如果我不使用.iter()使迭代器可变,我尝试了下面的方法

代码语言:javascript
运行
复制
fn main() {
    let mut vec = vec![1, 2, 3, 4];
    let mut wrong = -1;

    let working = match vec.iter().find(|&c| *c == 2) {
        Some(c) => c,
        None => &wrong
    };

    println!("Result: {}", working);
}

但是当我尝试使用可变迭代器.iter_mut()获取可变引用时,

代码语言:javascript
运行
复制
fn main() {
    let mut vec = vec![1, 2, 3, 4];
    let mut wrong = -1;

    let mut error = match vec.iter_mut().find(|&c| *c == 2) {
        Some(c) => c,
        None => &mut wrong
    };

    println!("Result: {}", error);
}

我得到以下错误:

errorE0507:无法从借来的内容中移出--> src/main.rs:5:48 \x\x\{\x\提示:为了防止移动,使用ref cref mut c \x不能移出借来的内容

我还尝试使用|&mut c|使闭包中的类型可变,但这会导致以下错误:

errorE0308:不匹配类型--> src/main.rs:5:48让mut error = match vec.iter_mut().find(AC.26&mut c *c == 2) { did ^类型在可变性中有所不同?=注意:预期类型&&mut {integer} .find类型&mut \_ = help:您的意思是mut c: &&&mut {integer}吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 20:54:58

铁锈的.find传递&Self::Item类型的回调,并且由于您使用的是.iter_mut(),所以您已经创建了一个迭代器,其中每个项都是&mut T。这意味着传递给find回调的类型是&&mut T。要把它送到打字机,你可以做任何一个

代码语言:javascript
运行
复制
vec.iter_mut().find(|&&mut c| c == 2)

代码语言:javascript
运行
复制
vec.iter_mut().find(|c| **c == 2)

第二种更好。

您所遇到的错误是因为您通过使用&c选择的中间位置将c设置为&mut T值,而Rust的一个重要规则是,多个事物不能同时拥有对一个项的可变引用。因为允许对一个项具有多个不可变的引用,所以不可变的情况可以工作。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48551026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档