在参数列表中构造不可变引用并可变地绑定

时间:2016-06-21 16:12:04

标签: rust

我想解构对var baseURL:String { #if DEBUG return "https://debug.myserver.url.com" #else return "https://production.myserver.url.com" #endif } - 类型的引用,并可变地绑定结果值。 注意:是的,我想创建给定参数的副本并改变该副本。这有效:

Copy

但我想通过参数列表中的解构来做到这一点。当我这样解构时:

fn foo(a: &u64) {
    let mut a = *a;
    mutate(&mut a);
}

Rust(可以理解)抱怨:

fn foo(&a: &u64) {
    mutate(&mut a);
}

但是编译器建议的解决方案不起作用!

<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) {

如何做我想做的事?

2 个答案:

答案 0 :(得分:2)

我认为你不能这样做。虽然模式可以解构数据(即,引入数据部分的绑定),并且绑定可以标记为可变,但在解构引用的情况下,似乎并不是将两者结合起来的方法,即使其他组合工作:

struct X(i32);
let it = X(5);
let X(mut inside) = it;
inside = 1;

这可能只是一个边缘情况,其他句法选择没有留下好的可能性。正如您所注意到的那样,&mut x已经被采用,并且模式中不支持使用括号消除歧义。

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

  1. 不要在模式中使绑定变为可变,然后创建一个新的可变绑定(let mut x = x;
  2. 开始时不要进行结构化 - 因为你只能说let mut x = *reference;,所以引用并不是非常有用。
  3. 试图在参数列表中过于聪明,无论如何都不利于可读性。

答案 1 :(得分:1)

这似乎适用于Rust操场:

fn foo(mut a: &mut u64) {
    mutate(a);
}

简短回答是你需要接受一个可变参数,该参数具有u64的可变引用类型。我无法提供更好的答案,我还在学习。

您可以在此处看到一个有效的示例:Rust Playground

如果我理解你的要求,我并不是百分百肯定,但是值得一试。