Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何返回借用状态以供以后使用的锈封?_Rust_Closures_Lifetime - Fatal编程技术网

Rust 如何返回借用状态以供以后使用的锈封?

Rust 如何返回借用状态以供以后使用的锈封?,rust,closures,lifetime,Rust,Closures,Lifetime,我有一个相当简单的代码。我有一种感觉,我需要用一生的时间来实现这一点,但我现在很难办 parse_string是一个函数,它接受对字符串的引用,并返回一个闭包供以后使用,代码如下: fn main() { let parse_this = parse_string(&String::from("Hello!")); println!("{}", parse_this("goodbye!")); } fn parse_string(string: &String)

我有一个相当简单的代码。我有一种感觉,我需要用一生的时间来实现这一点,但我现在很难办

parse_string是一个函数,它接受对字符串的引用,并返回一个闭包供以后使用,代码如下:

fn main() {
    let parse_this = parse_string(&String::from("Hello!"));
    println!("{}", parse_this("goodbye!"));
}

fn parse_string(string: &String) -> impl Fn(&str) -> &String {
    return |targetString| {
        // pretend there is parsing logic
        println!("{}", targetString);
        return string;
    };
}
编译器错误:

错误:无法推断适当的生存期 ->src/main.rs:7:12 | 6 | fn parse_stringstring:&String->impl fn&str->&String{ |-----此返回类型的计算结果为“static”生存期。。。 7 |返回|目标字符串|{ | ____________^ 8 | |//假设存在解析逻辑 9 | | println!{},targetString; 10 | |返回字符串; 11 | | }; ||59143。。。 | 注意:…不能超过函数体上定义的匿名生存期1,时间为6:1 ->src/main.rs:6:1 | 6 |/fn parse_stringstring:&String->impl fn&str->&String{ 7 | |返回|目标字符串|{ 8 | |//假设存在解析逻辑 9 | | println!{},targetString; 10 | |返回字符串; 11 | | }; 12 | | } | |_^ 帮助:您可以向返回类型添加一个约束,使其持续时间小于“static”,并与函数体上定义的匿名生存期1(6:1)相匹配 | 6 | fn parse_stringstring:&String->impl fn&str->&String+''{ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 错误[E0312]:引用的生存期超过借用内容的生存期。。。 ->src/main.rs:10:16 | 10 |返回字符串; | ^^^^^^ | 注意:…该引用对正文7:12定义的匿名生存期2有效。。。 ->src/main.rs:7:12 | 7 |返回|目标字符串|{ | ____________^ 8 | |//假设存在解析逻辑 9 | | println!{},targetString; 10 | |返回字符串; 11 | | }; | |_____^ 注意:…但借用的内容仅对函数体上以6:1定义的匿名生存期1有效 ->src/main.rs:6:1 | 6 |/fn parse_stringstring:&String->impl fn&str->&String{ 7 | |返回|目标字符串|{ 8 | |//假设存在解析逻辑 9 | | println!{},targetString; 10 | |返回字符串; 11 | | }; 12 | | } | |_^
您有许多复合问题:

您需要一个显式的生存期来将字符串参数的生存期连接到返回闭包的返回值的生存期。现在,将导致它被推断为与闭包的参数相同

不能通过函数返回对临时变量的引用。它必须是一个不同的变量

您必须将字符串移动到闭包中,以防止对它进行另一次引用,这不会持续足够长的时间

另外

targetString应该是target_字符串,以遵循Rust习惯用法。 不应在块末尾使用return来遵循Rust习惯用法。 &str通常优先于&字符串 另见:


您需要添加一个显式的生存期注释来解析_字符串,以便编译器可以判断哪些生存期相同,哪些可能不同

Fn&str->&String将是返回与传入的&str具有相同生存期的&String的函数的类型,即,返回的&String与传入的&String具有相同的生存期,以解析\u字符串:

在函数的最后一个表达式中省略返回是习惯用法

还请注意,&String是一种不寻常的类型,因为它没有&str不提供的表达能力。在非泛型代码中使用&String几乎总是一个错误。有关详细信息,请参阅

总而言之,以下是我编写parse_字符串的方法:

我真的不知道为什么字符串被重新加载到这里而不是被移动。我猜编译器还不够聪明
fn main() {
    let s = String::from("Hello!");
    let parse_this = parse_string(&s);
    println!("{}", parse_this("goodbye!"));
}

fn parse_string<'a>(string: &'a String) -> impl Fn(&str) -> &'a String {
    return move |target_string| {
        // pretend there is parsing logic
        println!("{}", target_string);
        string
    };
}
fn parse_string<'a>(string: &'a String) -> impl Fn(&str) -> &'a String {
    move |target_string| {
        // pretend there is parsing logic
        println!("{}", target_string);
        string
    }
fn parse_string<'a>(string: &'a str) -> impl Fn(&str) -> &'a str {
    move |target_string| {
        // pretend there is parsing logic
        println!("{}", target_string);
        string
    }
}
fn main() {
    let hello = String::from("Hello!");
    let parse_this = parse_string(&hello);
    println!("{}", parse_this("goodbye!"));
}