gpt4 book ai didi

rust - Inmutable 和 Mutable 在调用 "const"方法时借用 "const"参数

转载 作者:行者123 更新时间:2023-12-05 08:29:24 28 4
gpt4 key购买 nike

我不明白为什么 Rust 在这段代码中提示(“不能作为不可变借用,因为也作为可变借用”)(即使考虑到 .len() 是一个“常量/无害”函数):

fn main() {

let mut xs1: [i32; 5] = [ 10, 20, 30, 40, 50];

let (slice1, slice2) = xs1.split_at_mut( (xs1.len()/2) ); // <----- ERROR

println!( "{:?}", slice1 );
println!( "{:?}", slice2 );



} // ()

虽然拆分版本没问题:

let aux = xs1.len()/2;
let (slice1, slice2) = xs1.split_at_mut( aux );

这里的基本原理是什么?

也许我错了,但我一直认为这两个表达式可以说是“数学上等价的”。不仅 len() 应该是一个 const 方法而且 split_at_mut() 的输入参数也应该是 const (用 C++ 的说法)。

仍然持有this question八年后?

最佳答案

Maybe I'm wrong but I always regarded both expressions as "mathematically equivalent" so to say.

是的,但这是借用检查器的问题,它并不完美,而且有局限性。

事实上,几乎所有没有漏洞的静态类型系统都会拒绝有效程序:选择是拒绝有效程序或接受无效程序。

在这种情况下,正如 Sven Marnach 指出的那样,它是严格表达式评估顺序的产物:如果您对以下调用进行脱糖处理:

<[_]>::split_at_mut(&mut xs1, xs1.len()/2);

你得到同样的错误。

本质上,Rust 解释

xs1.split_at_mut(xs1.len() / 2)

作为

{
let p1 = &mut xs1;
{
let p2 = xs1.len();
{
<[_]>::split_at_mut(p1, p2);
}
}
}

Not only len() should be a const method

...它是什么?

but also the input param for split_at_mut() should be const (in C++ parlance).

这个想法与 Rust 无关,split_at_mut 拥有其(非 self )参数的所有权。

关于rust - Inmutable 和 Mutable 在调用 "const"方法时借用 "const"参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70799516/

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