为什么传递向量有效但切片不起作用?

Why does passing a vector work but not a slice?

提问人:Aharon Sambol 提问时间:2/9/2023 最后编辑:LeopardSharkAharon Sambol 更新时间:2/14/2023 访问量:141

问:

当我写这篇文章时:

fn add1(vc: &mut Vec<usize>) {
    func1(vc, vc[0]);
}
fn func1(vc: &mut Vec<usize>, val: usize) {}

Clippy 告诉我,“写作而不是涉及一个新对象,而切片就可以了”。&mut Vec&mut [_]

但是,如果我将其切换到这个:

fn add1(vc: &mut Vec<usize>) {
    func1(vc, vc[0]);
}
fn func1(vc: &mut [usize], val: usize) {}

我得到“不能借用为不可变的,因为它也被借用为可变的 [E0502]”。*vc

这是有道理的,但为什么它以前有效呢?

另外,为什么 Clippy 会给我不正确的警告?

链接到工作实例

链接到不工作的例子

切片 借用检查器

评论

0赞 kaya3 2/9/2023
区别可能是因为从到的胁迫涉及再借款,而在第一个例子中没有胁迫。&mut Vec<usize>&mut [usize]
0赞 Aharon Sambol 2/9/2023
@kaya3为什么会有什么不同呢?
0赞 user4815162342 2/9/2023
您可以将这两个函数转换为切片:play.rust-lang.org/...
0赞 user4815162342 2/9/2023
您还可以调用以创建一个显式并将其用于两个参数,这将编译:play.rust-lang.org/...as_mut()&mut [usize]
1赞 Sven Marnach 2/9/2023
第一个(工作)示例触发了 的隐式重新借用,这显然是在处理整个参数列表以某种方式发生的。第二个(非工作)示例触发了未大小的强制,这显然发生在遇到第一个参数时。这个时序意味着在第一种情况下,在处理第二个参数时尚未借用,而在第二种情况下,它是借用的。为什么时间会这样,我不知道,也没有关于它的文档。vcvc

答: 暂无答案