2016-05-25 17 views

答えて

2

実際の使用状況によって異なります。戻り値だけではないy 1に、x引数に依存しているため、唯一の生存期間を使用することが欠点である。ここ

fn xory<'a>(x: &'a str, y: &'a str) -> &'a str { 
    x 
} 

:あなたが書いた正確なコードが与えられました。のは、このユーザーコードを想像してみましょう:outは基本的にx_inあるので、私たちは、これが正常に動作することを期待する

let x_in = "paul".to_owned(); 
let out = { 
    let y_in = "peter".to_owned(); 
    xory(&x_in, &y_in) 
}; 

。コンパイラは文句しかし:

<anon>:12:22: 12:26 error: `y_in` does not live long enough 
<anon>:12   xory(&x_in, &y_in) 
           ^~~~ 
<anon>:13:7: 14:2 note: reference must be valid for the block suffix following statement 1 at 13:6... 
<anon>:13  }; 
<anon>:14 } 
<anon>:11:39: 13:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 11:38 
<anon>:11   let y_in = "peter".to_owned(); 
<anon>:12   xory(&x_in, &y_in) 
<anon>:13  }; 

コンパイラがxory参照両方の引数から出力することを(xory署名から)を前提とするためです。したがって、パラメーター間の不必要な条件/前提条件/関係を避けるために、可能な限り詳細にライフタイムを指定する方が良い場合がよくあります。

あなたが唯一の生涯(またはわずかに異なる解決策)を使用する必要がありますいくつかのケースでは

:あなたには、いくつかの条件に応じて、xまたはyのいずれかを返すようにしたいとします

fn xory<'a>(x: &'a str, y: &'a str) -> &'a str { 
    if x.len() == 42 { 
     x 
    } else { 
     y 
    } 
} 

ここでの寿命出力は両方の引数の存続時間に依存する可能性があり、コンパイル時にどちらの引数が出るかはわかりません。それゆえ、私たちは最悪の状況に備えてこれを好きにしなければなりません。

+0

ああ、両方の入力に依存する場合、出力は統一する必要があります。 – Snark

1

戻り値がxまたはyのいずれかから借用できると言っているので、関数本体の観点から見ると、より柔軟です。 呼び出し元からはxyの両方が結果が保持される限り有効である必要があるため、より制限的です(ちょうどxではなく)。

関連する問題