을 사용하는 경우에만 나는 컴파일하려면 다음과 같은 간단한 코드를 얻으려고 :값은 "충분히 살지 않는"하지만 함수 포인터
이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
의 실행 시간 동안 만 지속되지만, 은 function
의 입력 값과 동일한 수명의 참조를 포함하는 호출의 값을 반환합니다. 즉, string
.
그러나, 나는 3 점에 혼란 스러워요 :
- 내가 함수 호출의 결과를
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>;'평생 엘 리젠트는 올바른 일을 할 것입니다. – red75prime