首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈不能以可变的形式借用(变量),因为它也是不可变的借入。

锈不能以可变的形式借用(变量),因为它也是不可变的借入。
EN

Stack Overflow用户
提问于 2022-08-29 18:24:46
回答 1查看 61关注 0票数 1

我遇到过类似于milion时间的类似错误,通常在有问题的代码周围放置大括号是有效的,但是我遇到了相当奇怪的情况:

代码语言:javascript
复制
fn breadth_first_index(
    root: CargoCrateVersionNode,
    redis_connection: &mut Connection,
    show_dev_dependencies: bool,
    show_build_dependencies: bool,
) {
    let mut already_included_versions = vec![root.ccv_version_id];
    let mut dependency_tree: Vec<(Option<DependsOnEdge>, CargoCrateVersionNode)> =
        vec![(None, root)];

    let mut i = 0;
    while i < dependency_tree.len() {
        let (edge_to_current_dependency, current_dependency) = &dependency_tree[i];

        let mut command =
            format!("match (main:CargoCrateVersion)-[edge:depends_on]->(connected) where main.ccv_version_id = {} and (edge.doe_kind = 0", current_dependency.ccv_version_id);
        if show_dev_dependencies {
            command.push_str(" or edge.doe_kind = 2");
        }
        if show_build_dependencies {
            command.push_str(" or edge.doe_kind = 1");
        }
        command.push_str(" )");
        command.push_str(" return edge, connected");

        let redis_answ = redis_connection.graph_query(GRAPH_NAME, command).unwrap();
        let mut parsed_dependencies =
            CargoCrateVersionNode::parse_bulk(&redis_answ.data, "connected").unwrap();
        let mut parsed_edges = DependsOnEdge::parse_bulk(&redis_answ.data, "edge").unwrap();

        while !parsed_dependencies.is_empty() {
            let dependency = parsed_dependencies.remove(0);
            let edge = parsed_edges.remove(0);

            if already_included_versions.contains(&dependency.ccv_version_id) {
                continue;
            }
            // This if let causes the error.
            // I've tried putting curly braces around this block of code, however I was unsucesfull.
            if let Some(edge_to_current) = &edge_to_current_dependency {
                if edge_to_current.doe_optional {
                    if let Some(edge_features) = &edge_to_current.doe_with_features {
                        println!("{:?}", edge_features);
                    }
                }
            }

            already_included_versions.push(dependency.ccv_version_id);
            dependency_tree.push((Some(edge), dependency));
        }
        i += 1;
    }
    println!("---- Dependency tree ----");
    for l in dependency_tree {
        println!("{:?}", l.1);
    }
}

我知道易变性和生命周期,但是我不明白为什么在我的情况下会有错误。我用的是锈菌1.63和生锈版2021。

我得到了以下错误

代码语言:javascript
复制
226 |         let (edge_to_current_dependency, current_dependency) = &dependency_tree[i];
    |                                                                 --------------- immutable borrow occurs here...
253 |                 if let Some(edge_to_current) = edge_to_current_dependency {
    |                                                -------------------------- immutable borrow later used here
...
262 |             dependency_tree.push((Some(edge), dependency));
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

For more information about this error, try `rustc --explain E0502`.
error: could not compile `package_finder` due to previous error

我知道发生了什么。我正在获取对可变列表中元素的引用,然后实现对此引用的不可变引用,同时在之后仍然对列表进行变异。我试图通过在if let语句周围添加花括号来解决这个问题,但是我仍然得到了相同的错误。我觉得这段代码应该在放置花括号后编译,但如果让的话,它不会编译。我是这么问的,因为我(有点天真)认为这是锈蚀编译器内部工作的错误。

编辑:我能够通过将有问题的行替换为对数组的dirrect访问来解决这个问题,但是无论如何,这并不理想。我觉得这确实是编译器内部的错误,对吗?

代码语言:javascript
复制
if let Some(edge_to_current) = &dependency_tree[i].0 {}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-29 20:04:38

编译器中没有错误(至少,您所呈现的代码是这样的)。问题是,你仍然不熟悉借贷和拥有锈菌的规则。

我想你会喜欢读这一本:https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html

但是,解决您的错误,这一行:let (edge_to_current_dependency, current_dependency) = &dependency_tree[i];

您正在破坏共享引用后面的元素。换句话说,您的let语句包含引用。

您可以借用(只是&)使用&dependency_tree的向量,然后访问它上的元素。没必要这么做。只是要访问的元素的take ownership (意思是,删除&)。

有一点:围绕if let的花括号不能解决任何问题。您只是在创建一个内部作用域,但是再次访问一个共享引用。

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

https://stackoverflow.com/questions/73533150

复制
相关文章

相似问题

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