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)
如果您愿意–不确定这是否特别可读。正是我要找的信息。谢谢。正是我要找的信息。谢谢。