gpt4 book ai didi

rust - 两个可变借用发生在同一条线上?

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

我正在尝试使用 Snowball stemmer在 Rust 中打包以提取词向量。应该很简单,但是借用检查器一直拒绝我的代码:

// 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() block 结束的地方。)

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)

我不确定这是否与这个库的实现细节有关,但我真的觉得卡在这里了。我从没想过阻止输入向量会如此困难。

最佳答案

来自documentation of stem_str :

The str reference it returns is only valid as long as you don't call stem or stem_str again; thus, Rust's borrowchecker won't let call one of them function if you have such a reference in scope.

据推测,这是因为词干分析器实现实际上有某种内部缓冲区,其中存储词干。

这就是为什么您不能在保留对字符串的引用的同时调用两次 stem_str 的原因;这样做会使第一个字符串无效!

I can't just call as_str() and expect to assign the obtained &str back to *t

编译器再次绝对正确。您正在尝试创建一个值,引用它,存储引用,然后删除该值!这是一个内存漏洞,你不能这样做。

相反,收集一个 String 向量:

for line in input.lock().lines() {
let line = line.unwrap();
let mut query: Vec<_> = line.split_whitespace()
.map(|t| stemmer.stem(t))
.collect();
}

我强烈推荐阅读 The Rust Programming Language并理解引用是如何工作的以及它们会阻止什么。在之前期间进入任何与所有权相关的复杂事物时执行此操作。这些章节具体:

关于rust - 两个可变借用发生在同一条线上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227212/

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