元组在Rust中不允许作为左值?

元组在Rust中不允许作为左值?,rust,Rust,在Rust中,我有一些方法返回两个元素,在这些场景中,返回两个元素对我来说非常有意义。不过,在实际调用这些方法时,我注意到Rust不允许使用元组作为左值,因此我无法重新分配给它们。假设test()是一个返回两个值的方法,那么我最终编写了很多如下代码: let (mut val1, mut val2) = test(); for i in 0..100 { // partially removed for brevity; let (_val1, _val2) = test();

在Rust中,我有一些方法返回两个元素,在这些场景中,返回两个元素对我来说非常有意义。不过,在实际调用这些方法时,我注意到Rust不允许使用元组作为左值,因此我无法重新分配给它们。假设
test()
是一个返回两个值的方法,那么我最终编写了很多如下代码:

let (mut val1, mut val2) = test();

for i in 0..100 {
   // partially removed for brevity;
   let (_val1, _val2) = test();
   val1 = _val1;
   val2 = _val2;
}

let (_val1, _val2) = test();
val1 = _val1;
val2 = _val2;
通常从我的方法返回的两个值是一些结构,反过来它们也有一些方法,所以我想在这些返回的结构中调用方法。无论如何,我经常使用上面的模式,它很快就会变得很麻烦。有没有更好的方法可以在Rust中实现我想要的功能?

您可以创建一个宏

macro_rules! assign{
    {($v1:ident, $v2:ident) = $e:expr} =>
    {
        let (v1, v2) = $e;
        $v1 = v1;
        $v2 = v2;
    };
    {($v1:ident, $v2:ident, $v3:ident) = $e:expr} =>
    {
        let (v1, v2, v3) = $e;
        $v1 = v1;
        $v2 = v2;
        $v3 = v3;
    }; // and so on
}
像这样使用它

assign!{(val1, val2) = test()};

可能存在的副本