サーチ…
構文
- fn関数<'a(x:&' a Type)
- struct Struct <'a> {x:&' a Type}
- enum Enum <'a> {Variant(&a a Type)}
- インプラント<'a>構造体<' a> {fn x <'a(&self) - >&' a {self.x}型}
- impl <'a>型の特性<' a>
- impl <'a>型<' a>の型
-
fn function<F>(f: F) where for<'a> F: FnOnce(&'a Type)
-
struct Struct<F> where for<'a> F: FnOnce(&'a Type) { x: F }
-
enum Enum<F> where for<'a> F: FnOnce(&'a Type) { Variant(F) }
-
impl<F> Struct<F> where for<'a> F: FnOnce(&'a Type) { fn x(&self) -> &F { &self.x } }
備考
- Rustのすべての参照は、たとえ明示的に注釈を付けられていなくても、存続期間を持ちます。コンパイラは、暗黙的にライフタイムを割り当てることができます。
-
'static
寿命'static
は、プログラムバイナリに格納された参照に割り当てられ、実行全体を通じて有効です。この生涯は、文字列リテラルに割り当てられ&'static str
。文字列リテラルには、&'static str
型があり&'static str
。
関数パラメータ(入力寿命)
fn foo<'a>(x: &'a u32) {
// ...
}
これがあることを指定foo
寿命を持っている'a
とパラメータx
、少なくともの寿命持っている必要があります'a
。機能の寿命は、通常、 寿命の経過とともに省略されます 。
fn foo(x: &u32) {
// ...
}
ある関数がパラメータとして複数の参照を取り、参照を返す場合、コンパイラは寿命のエリートによって結果の存続期間を推論することはできません。
error[E0106]: missing lifetime specifier
1 | fn foo(bar: &str, baz: &str) -> &i32 {
| ^ expected lifetime parameter
代わりに、生涯パラメータを明示的に指定する必要があります。
// Return value of `foo` is valid as long as `bar` and `baz` are alive.
fn foo<'a>(bar: &'a str, baz: &'a str) -> &'a i32 {
関数は、複数の生涯パラメータも取ることができます。
// Return value is valid for the scope of `bar`
fn foo<'a, 'b>(bar: &'a str, baz: &'b str) -> &'a i32 {
構造体フィールド
struct Struct<'a> {
x: &'a u32,
}
これは、 Struct
任意のインスタンスが生存時間'a
を持ち、 x
格納された&u32
の寿命が少なくとも'a
でなければならないことを指定します。
Implブロック
impl<'a> Type<'a> {
fn my_function(&self) -> &'a u32 {
self.x
}
}
これがあることを指定Type
寿命を持っている'a
とによって返される参照ことmy_function()
、もはや後に有効ではないかもしれない'a
ので、終了Type
もはや保持するために存在self.x
。
高ランク特性限界
fn copy_if<F>(slice: &[i32], pred: F) -> Vec<i32>
where for<'a> F: Fn(&'a i32) -> bool
{
let mut result = vec![];
for &element in slice {
if pred(&element) {
result.push(element);
}
}
result
}
これは、 Fn
特性バインド内のi32の参照が任意の有効期間を持つことができることを指定します。
以下は動作しません。
fn wrong_copy_if<'a, F>(slice: &[i32], pred: F) -> Vec<i32>
where F: Fn(&'a i32) -> bool
{ // <----------------+
let mut result = vec![]; // 'a scope |
for &element in slice { // <--------+ |
if pred(&element) { // | |
result.push(element); // element's| |
} // scope | |
} // <--------+ |
result // |
} // <----------------+
コンパイラは次のエラーを返します。
error: `element` does not live long enough
if pred(&element) { // | |
^~~~~~~
element
ローカル変数は'a
生涯(コードのコメントからわかるように)生存していないためです。
寿命は機能レベルで宣言することはできません。これは、別の生涯が必要なためです。だから私たちfor<'a>
のために使ったのfor<'a>
、リファレンスがどのような有効期間にも有効であることを指定することです(したがって、より短い有効期間を使用することができます)。
上位ランクの属性境界は、構造体でも使用できます。
struct Window<F>
where for<'a> F: FnOnce(&'a Window<F>)
{
on_close: F,
}
他の項目についても同様です。
高ランクの形質境界は、 Fn*
形質で最も一般的に使用されFn*
。
これらの例では、生涯エリージョンが正常に機能するので、寿命を指定する必要はありません。