Binding &引用;应为标识符,在尝试绑定元组变量时找到

Binding &引用;应为标识符,在尝试绑定元组变量时找到,binding,rust,Binding,Rust,我玩了一点锈,卡住了。我有以下功能: fn addOne(h: (i32, i32, i32)){ let mut (x, y, z) = h; (x+1, y+1, z+1) } 这使我在编译时出现以下错误: example.rs:2:10: 2:11 error: expected identifier, found `(` example.rs:2 let mut (x, y, z) = h; 绑定是否有问题?如果这是一个如此简单的问题,很抱歉。每个变量都应用

我玩了一点锈,卡住了。我有以下功能:

fn addOne(h: (i32, i32, i32)){

    let mut (x, y, z) = h;

    (x+1, y+1, z+1)
}
这使我在编译时出现以下错误:

example.rs:2:10: 2:11 error: expected identifier, found `(`
example.rs:2    let mut (x, y, z) = h;

绑定是否有问题?如果这是一个如此简单的问题,很抱歉。

每个变量都应用
mut
限定符。当您解构变量时,每个变量都可以是可变的或不可变的:

fn add_one(h: (i32, i32, i32)) -> (i32, i32, i32) {
    let (mut x, mut y, mut z) = h;
    (x+1, y+1, z+1)
}
当然,这里根本不需要可变性:

fn add_one(h: (i32, i32, i32)) -> (i32, i32, i32) {
    let (x, y, z) = h;
    (x+1, y+1, z+1)
}
您还可以选择在函数签名中分解结构:

fn add_one((x, y, z): (i32, i32, i32)) -> (i32, i32, i32) {
    (x+1, y+1, z+1)
}
或者使用默认的元组访问器方法:

fn add_one(h: (i32, i32, i32)) -> (i32, i32, i32) {
    (h.0 + 1, h.1 + 1, h.2 + 1)
}
如果您想对元组进行适当的变异,则需要提供对元组的可变引用。在不了解您试图解决的问题的更多信息的情况下,我会积极劝阻您选择此路径,至少在您分析并确定需要它之前:

fn add_one(h: &mut (i32, i32, i32)) {
    h.0 += 1;
    h.1 += 1;
    h.2 += 1;
}

fn main() {
    let mut a = (1, 2, 3);
    add_one(&mut a);
    println!("{:?}", a)
}

有很多方法可以编写对您有意义的代码!

还有一个问题:如果我想让这个函数不返回任何内容,我还能更改作为参数传递的变量(声明为mut)吗?是的。像这个函数一样,它的唯一目的是向元组的每个元素添加1,而元组在add\one之外声明