Rust 在参数列表中分解不可变引用和可变绑定

Rust 在参数列表中分解不可变引用和可变绑定,rust,Rust,我想对一个Copy-类型的引用进行解构,并可变地绑定结果值。注意:是的,我想创建一个给定参数的副本并对该副本进行变异。这项工作: fn foo(a: &u64) { let mut a = *a; mutate(&mut a); } 但我想通过参数列表中的解构来实现。当我像这样分解结构时: fn foo(&a: &u64) { mutate(&mut a); } Rust(可以理解)抱怨: <anon>:3:17:

我想对一个
Copy
-类型的引用进行解构,并可变地绑定结果值。注意:是的,我想创建一个给定参数的副本并对该副本进行变异。这项工作:

fn foo(a: &u64) {
    let mut a = *a;
    mutate(&mut a);
}
但我想通过参数列表中的解构来实现。当我像这样分解结构时:

fn foo(&a: &u64) {
    mutate(&mut a);
}
Rust(可以理解)抱怨:

<anon>:3:17: 3:18 error: cannot borrow immutable local variable `a` as mutable
<anon>:3     mutate(&mut a);
                         ^
<anon>:1:9: 1:10 help: to make the local variable mutable, use `mut` as shown:
<anon>:  fn foo(&mut a: &u64) {
:3:17:3:18错误:无法将不可变的局部变量'a'借用为可变的
:3变异(&mut a);
^
:1:9:1:10帮助:要使局部变量可变,请使用'mut',如图所示:
:fn foo(&mut a:&u64){
但是编译器建议的解决方案不起作用

<anon>:1:8: 1:14 error: mismatched types:
 expected `&u64`,
    found `&mut _`
(values differ in mutability) [E0308]
<anon>:1 fn foo(&mut a: &u64) {
                ^~~~~~
:1:8:1:14错误:不匹配的类型:
应为“&u64”,
找到`&mut_`
(值的可变性不同)[E0308]
:1 fn foo(&mut a:&u64){
^~~~~~

如何做我想做的事?

这似乎适用于铁锈操场:

fn foo(mut a: &mut u64) {
    mutate(a);
}
简单的回答是,您需要接受一个可变参数,该参数具有对
u64
的可变引用类型。我无法提供更好的答案,我还在学习

在这里,您可以看到一个工作示例:


我不能百分之百确定我是否理解你的要求,但值得一试。

我认为你做不到。而模式可以分解数据(即,为部分数据引入绑定),并且绑定可以标记为可变的,在对引用进行分解的情况下,似乎没有办法将两者结合起来,即使其他组合也可以:

struct X(i32);
let it = X(5);
let X(mut inside) = it;
inside = 1;
这可能只是一种边缘情况,其他语法选择没有很好的可能性。正如您所注意到的,
&mut x
已经被采用,并且模式中不支持使用括号消除歧义

这不是一个大问题,因为有几种方法可以在模式之外做同样的事情:

  • 不要在模式中使绑定可变,然后创建新的可变绑定(
    让mut x=x;
  • 不要从&dash;开始分解结构,它对引用没有太大用处,因为您可以说
    let mut x=*reference;

  • 无论如何,在参数列表中过于聪明对可读性是有害的。

    在代码中,
    a
    的类型不同(
    &mut u64
    &u64
    )是的,但这是问题的一个解决方案。因为我不确定他们想要的是可变引用还是可变值。问题已经澄清了。感觉就像是
    fn foo(mut&a:&u64)
    应该有效,但它不能。@Shepmaster为什么有效?
    mut
    适用于名称,而不是整个模式。你没有使引用可变,而是使
    a
    可变。@delnan我承认没有彻底考虑所有可能的途径。也许这是坏的ole-C思维-用
    &
    和然后使结果可变。这就是为什么我在回答中做了一个注释,而不是真正显示我的无知。我认为这是不可能的。在这种情况下,您使用的是复制类型,因此您可以只使用
    muta:u64
    而不是引用。然后,每当调用函数时,编译器都会为您生成可变副本。