Rust 如何使用解构以易于处理元组?

Rust 如何使用解构以易于处理元组?,rust,Rust,我有以下代码: fn f(x: &mut (i32, i32)) -> &(i32, i32) { x.1 = x.1 + 11; x.0 = x.0 * 10; x } 我希望: fn f((x, y) as t: &mut (i32, i32)) -> &(i32, i32) { x = x + 11; y = y * 10; t } 这样的可读性可以实现吗 这样的可读性可以实现吗 不,不是在当前

我有以下代码:

fn f(x: &mut (i32, i32)) -> &(i32, i32) {
    x.1 = x.1 + 11;
    x.0 = x.0 * 10;
    x
}
我希望:

fn f((x, y) as t: &mut (i32, i32)) -> &(i32, i32) {
    x = x + 11;
    y = y * 10;
    t
}
这样的可读性可以实现吗

这样的可读性可以实现吗

不,不是在当前或计划的未来。与所需语法相似的语法已经存在:

fn f(t @ &mut (ref x, ref y): &mut (i32, i32)) -> &(i32, i32)
但是,这是不允许的:

错误[E0007]:无法通过移动与子绑定进行绑定
-->src/main.rs:3:6
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^通过移动已绑定的移动值来绑定该值
错误[E0303]:在`@`
-->src/main.rs:3:16
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^之后不允许`@`
错误[E0303]:在`@`
-->src/main.rs:3:23
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^之后不允许`@`
这种代码的一个棘手的方面是,你会有可变的别名-你可以通过
t.0
x
来更改相同的值。这在Rust中是不允许的

高度预期的非词汇生存期(NLL)可能会让编译器更好地解释这些情况,但我还没有听说有人讨论过这方面的问题


如果您愿意灵活,有以下几种选择:

fn f(t: &mut (i32, i32)) -> &(i32, i32) {
    {
        let &mut (ref mut x, ref mut y) = t;
        *x = *x + 11;
        *y = *y * 10;
    }
    t
}
在夜间锈蚀中,这可以简化:

#![feature(match_default_bindings)]

fn f(t: &mut (i32, i32)) -> &(i32, i32) {
    {
        let (x, y) = t;
        *x = *x + 11;
        *y = *y * 10;
    }
    t
}
据我所知,NLL应该改进这两种情况

由于您正在获取并返回相同的值引用,因此可以停止返回它:

fn f(&mut (ref mut x, ref mut y): &mut (i32, i32)) {
    *x = *x + 11;
    *y = *y * 10;
}
同样,在夜间生锈时也可以对其进行改进:

#![feature(match_default_bindings)]

fn f((x, y): &mut (i32, i32)) {
    *x = *x + 11;
    *y = *y * 10;
}
这样的可读性可以实现吗

不,不是在当前或计划的将来。与您想要的语法相似的语法已经存在:

fn f(t @ &mut (ref x, ref y): &mut (i32, i32)) -> &(i32, i32)
但是,这是不允许的:

错误[E0007]:无法通过移动与子绑定进行绑定
-->src/main.rs:3:6
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^通过移动已绑定的移动值来绑定该值
错误[E0303]:在`@`
-->src/main.rs:3:16
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^之后不允许`@`
错误[E0303]:在`@`
-->src/main.rs:3:23
|
3 | fn f(t@&mut(ref x,ref y):&mut(i32,i32)->和(i32,i32){
|^^^^^^之后不允许`@`
这种代码的一个棘手的方面是,你会有可变的别名-你可以通过
t.0
x
来更改相同的值。这在Rust中是不允许的

高度预期的非词汇生存期(NLL)可能会让编译器更好地解释这些情况,但我还没有听说有人讨论过这方面的问题


如果您愿意灵活,有以下几种选择:

fn f(t: &mut (i32, i32)) -> &(i32, i32) {
    {
        let &mut (ref mut x, ref mut y) = t;
        *x = *x + 11;
        *y = *y * 10;
    }
    t
}
在夜间锈蚀中,这可以简化:

#![feature(match_default_bindings)]

fn f(t: &mut (i32, i32)) -> &(i32, i32) {
    {
        let (x, y) = t;
        *x = *x + 11;
        *y = *y * 10;
    }
    t
}
据我所知,NLL应该改进这两种情况

由于您正在获取并返回相同的值引用,因此可以停止返回它:

fn f(&mut (ref mut x, ref mut y): &mut (i32, i32)) {
    *x = *x + 11;
    *y = *y * 10;
}
同样,在夜间生锈时也可以对其进行改进:

#![feature(match_default_bindings)]

fn f((x, y): &mut (i32, i32)) {
    *x = *x + 11;
    *y = *y * 10;
}

您可以使用
fn-f(&mut(ref-mut x,ref-mut y):&mut(i32,i32))->&(i32,i32)
,如果您不确定这是否特别可读。您可以使用
fn-f(&mut(ref-mut x,ref-mut y):&mut(i32,i32))->&(i32,i32)
如果您愿意–不确定这是否特别可读。正是我要找的信息。谢谢。正是我要找的信息。谢谢。