Rust 两个可变借款发生在同一行?

Rust 两个可变借款发生在同一行?,rust,borrow-checker,Rust,Borrow Checker,我正试图用生锈的板条箱来堵住一大堆单词。这应该很简单,但借用检查器一直拒绝我的代码: // 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_white

我正试图用生锈的板条箱来堵住一大堆单词。这应该很简单,但借用检查器一直拒绝我的代码:

// 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);
    }
    // …
}
如果我直接调用
stem()
方法,我会得到一个
字符串
,但是我不能只调用
作为_str()
,并期望将获得的
&str
分配回
*t
,因为借阅检查器抱怨“借阅的值活得不够长”

57 18错误借用值的有效期不够长(此处创建的临时值)(生锈货物)
57 18信息考虑使用“让”绑定来增加它的寿命(锈蚀货物)
57 42信息临时价值仅在此处有效(生锈货物)
80 5信息临时价值需要持续到此处(生锈货物)
我不确定这是否与这个库的实现细节有关,但我真的觉得被困在这里了。我从来没有想到,对输入向量进行词干分析会如此困难。

来自:

它返回的str引用只有在您不再调用stem或stem_str时才有效;因此,如果范围中有这样的引用,Rust的borrowchecker将不允许调用其中一个函数

据推测,这是因为词干分析器实现实际上有某种内部缓冲区,在该缓冲区中,单词作为词干进行存储

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

我不能只调用
作为_str()
并期望将获得的
&str
分配回
*t

编译器是绝对正确的。您正试图创建一个值,获取该值的引用,存储该引用,然后删除该值!这是一个内存漏洞,你不能这么做

而是收集
String
s的向量:

for line in input.lock().lines() {
    let line = line.unwrap();
    let mut query: Vec<_> = line.split_whitespace()
        .map(|t| stemmer.stem(t))
        .collect();
}
input.lock().lines()中的行的
){
让line=line.unwrap();
let mut query:Vec=line.split_whitespace()
.map(| t | stemmer.stem(t))
.收集();
}
我强烈建议阅读和理解参考文献的工作原理以及它们所阻止的。在涉及所有权的任何复杂问题之前和期间都要这样做。这些章节具体包括:


或_exit()
似乎不是一个宏,正如您在上面的评论中所说,因为
缺失(输入错误?)。另外:您能添加完整的编译器错误吗?:)@LukasKalbertodt是在代码库中定义的,而不是标准库。我可能应该将这里的代码示例更改为
unwrap()
。现在我把全部错误都包括进去了。我读过这本书,但显然这些概念还需要一些时间来消化。使用您的方法,我可以得到
字符串的向量
s,但是有些函数需要
Vec
。是否有一种方便的方法将
Vec
转换为
Vec
,或者避免编写需要
Vec
的函数并将其输入类型更改为
Vec
,这会更为惯用。如果有用,可以将函数类型更改为接受
&str
字符串
。对。我先在谷歌上搜索了一下,但我似乎犯了写“Vector”而不是“Vec”的错误,并且没有遇到来自谷歌的相关结果。谢谢你指出这个问题。@JIXiang同样,如果你写了这些方法,你可能会想。