【发布时间】:2025-12-31 03:20:09
【问题描述】:
我正在尝试使用 Rust 中的 Snowball stemmer crate 来阻止单词向量。应该很简单,但是借用检查器一直拒绝我的代码:
// Read user input
let input = stdin();
let mut stemmer = Stemmer::new("english").unwrap();
for line in input.lock().lines() {
let line = line.unwrap();
let mut query: Vec<_> = line.split_whitespace().collect();
for t in &mut query {
*t = stemmer.stem_str(t);
}
// …
}
借用检查器说我在*t = stemmer.stem_str(t); 行上有两个stemmer 的可变借用并拒绝我的代码。 (第 80 行是 for line in input.lock().lines() 块的结束位置。)
57 18 error E0499 cannot borrow `stemmer` as mutable more than once at a time (first mutable borrow occurs here) (rust-cargo)
57 18 error E0499 cannot borrow `stemmer` as mutable more than once at a time (second mutable borrow occurs here) (rust-cargo)
80 5 info E0499 first borrow ends here (rust-cargo)
如果我直接调用stem() 方法,我会得到一个String,但是我不能只调用as_str() 并期望将获得的&str 分配回*t,因为借用检查器抱怨“借来的价值不够长”。
57 18 error borrowed value does not live long enough (temporary value created here) (rust-cargo)
57 18 info consider using a `let` binding to increase its lifetime (rust-cargo)
57 42 info temporary value only lives until here (rust-cargo)
80 5 info temporary value needs to live until here (rust-cargo)
我不确定这是否与这个库的实现细节有关,但我真的觉得卡在这里。我从没想过阻止输入向量会如此困难。
【问题讨论】:
-
or_exit()似乎不是宏,正如您在上面的评论中所说,因为缺少!(错字?)。另外:您可以添加完整的编译器错误吗? :) -
@LukasKalbertodt 这是代码库中定义的东西,而不是标准库。我可能应该将这里的代码示例简单地更改为
unwrap()。我现在包含了完整的错误。
标签: rust borrow-checker