2017-12-30 32 views
2

2つの要素を返すRustにはいくつかのメソッドがあります。これらのシナリオでは、2つの要素を返すのは本当に意味があります。実際にそれらのメソッドを呼び出すと、Rustはタプルを左辺値として使用できないことに気付きました。したがって、私はそれらに再割り当てできません。 test()は、2つの値を返すメソッドであると仮定すると、私はこのようなコードの多くを書いて終わる:タプルはラストの左辺値として使用できませんか?

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; 

通常私のメソッドから返された2つの値は、いくつかの構造であり、そして今度は、彼らはいくつかを持っていますメソッドもありますので、返された構造体のメソッドを呼び出す必要があります。とにかく、私は上記のパターンを多く使用し、非常に煩雑になります。私が欲することをやるためのよりよいアプローチはありますか?

+1

[私は新しい変数に結果を結合することなくタプルをdestructure缶の可能性のある重複したようにそれを使用することができますlet/match/forステートメント?](https://stackoverflow.com/questions/34304341/can-i-destructure-a-tuple-without-binding-the-result-to-a-new-variable-in- a-let) – Stefan

答えて

1

あなたはマクロ

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()}; 

Playground

+0

ありがとう、これはうまくいきます。 – tinker

関連する問題