を使用している場合にのみ:値は「十分に長く住んでいない」が、私は、コンパイルするには、次の単純化されたコードを取得しようとしている関数ポインタ
type FunctionType<'input> = fn(input_string: &'input str) -> Result<(), &'input str>;
fn okay<'input>(_input_string: &'input str) -> Result<(), &'input str> {
Ok(())
}
fn do_stuff_with_function(function: FunctionType) {
let string = String::new();
match function(string.as_str()) {
Ok(_) => {},
Err(_) => {},
}
}
fn main() {
do_stuff_with_function(okay);
}
遊び場は、不平を言う:
error[E0597]: `string` does not live long enough
--> src/main.rs:13:20
|
13 | match function(string.as_str()) {
| ^^^^^^ does not live long enough
...
18 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 11:1...
--> src/main.rs:11:1
|
11 |/fn do_stuff_with_function(function: FunctionType) {
12 | | let string = String::new();
13 | | match function(string.as_str()) {
14 | | Ok(_) => {},
... |
17 | |
18 | | }
| |_^
私は他の状況でエラーが発生する理由を理解しています:do_stuff_with_function
が実行されている間だけstring
が存続しますが、の呼び出しの値は入力値valと同じですすなわち、string
である。私は両方のブランチのため()
を返し、その後、関数呼び出しの結果をmatch
- :
はしかし、私は三点に困惑しています。無条件で放棄された場合、価値の生涯は
function
によって返されるのはなぜですか? - パラメータ
function
への呼び出しを、okay
(同一の署名を持つ)への直接参照で置き換えると、苦情なしでコンパイルされます。 - エラーメッセージには、必要な有効期間が実際の有効期間と同じであることが示されています(ただし、完全に記載されていません)。
これは私の場合に有効です!私はまだ私の元の質問のポイント(1)がコンパイラを満足させるのに十分でない理由を確信しています。あなたがエイリアスをインライン化しなければならないのは悲しいです(私が持っている本当のものはむしろ巨大です)。奇妙なタイプの魔法です。 – stuffy
@stuffyでは、エイリアスをインライン化する必要はありません。 'for <'_>'を追加することができます。 [遊び場](https://play.rust-lang.org/?gist=bbd442124db421e7201baa5b29ea7829&version=stable) – red75prime
また、タイプエイリアスから '<'input>'を削除することもできます。 'FunctionType = fn(input_string:&str) - > Result <()、&str>;' Lifetime elisionは正しいことを行います。 – red75prime