【问题标题】:Why does this Rust 2018 code compile with `cargo build` but not using rustc?为什么这个 Rust 2018 代码使用 `cargo build` 编译但不使用 rustc?
【发布时间】:2019-03-09 22:14:10
【问题描述】:

当使用 cargo build 编译下面这个 sn-p 时,借用检查器似乎很好,但是当使用 rustc 时我得到错误

error[E0502]: cannot borrow `char_counts` as mutable because it is also borrowed as immutable
  --> src/lib.rs:14:17
   |
10 |         let count = char_counts.get(&char);
   |                     ----------- immutable borrow occurs here
...
14 |                 char_counts.insert(char, rem);
   |                 ^^^^^^^^^^^ mutable borrow occurs here
...
19 |     }
   |     - immutable borrow ends here

任何想法为什么会发生这种情况?

use std::collections::HashMap;

pub fn anagram(word: &str, another_word: &str) -> i32 {
    let mut char_counts = HashMap::new();
    for char in word.chars() {
        let count = char_counts.entry(char).or_insert(0);
        *count += 1;
    }
    for char in another_word.chars() {
        let count = char_counts.get(&char);
        if let Some(val) = count {
            let rem = val - 1;
            if rem > 0 {
                char_counts.insert(char, rem);
            } else {
                char_counts.remove(&char);
            }
        }
    }
    println!("{:?}", char_counts);
    return char_counts.keys().len() as i32;
}

cargo --versionrustc --version 命令都输出1.33

【问题讨论】:

  • rustc --versioncargo --version 的输出是什么?
  • 两个命令都输出1.33
  • 我观察到相同的行为(Linux,1.33.0 for rustc)。奇怪的是,如果我这样做 rustc --edition 2018 main.rs 它会编译。

标签: rust borrow-checker


【解决方案1】:

如果您启用了non-lexical lifetimes,此函数将编译得很好,并且没有它们将无法编译。 2018 版默认启用它们。也许您的Cargo.toml 中有edition = "2018",但在直接使用 rustc 时没有将其作为参数传递?

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2022-11-24
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多