gpt4 book ai didi

rust - 匹配表达式中 format!() 的生命周期太短

转载 作者:行者123 更新时间:2023-11-29 08:01:44 24 4
gpt4 key购买 nike

我正在实现自定义 Display::fmt对于我自己的代表间隔的结构。

struct Range<T> {
lower: Option<T>,
upper: Option<T>,
}

范围可以是 Range { lower: Some(1), upper: None } ,这意味着它包含从 1 到无穷大的所有整数(或者我想是 i32 的极限)。

我想实现 Display::fmt使用 TDisplay::fmt如果边界不是 None否则显示空字符串:

let range = Range { lower: Some(1), upper: None }
println!("{}", range); // Prints <1,>

let range = Range { lower: Some(1), upper: Some(10) }
println!("{}", range); // Prints <1,10>

let range = Range { lower: None, upper: Some(10) }
println!("{}", range); // Prints <,10>

我已经开始我的实现,但在使用 match 时遇到了问题format!() 生成的字符串的表达式和生命周期.我的实现的问题是格式返回的字符串的生命周期不够长,无法进一步使用。

fn main() {
let opt = Some(1);

let opt_display = match opt {
Some(x) => &format!("{}", x), // error: borrowed value does not live long enough
None => "",
};

println!("opt: {}", opt_display);
}

为什么我的方法不起作用?什么是解决我的问题的好方法?

最佳答案

我不是生命周期方面的专家,但我相信这里的问题是您正试图从 format 创建的 String 返回一个 &String! 在比赛中。由于格式的范围仅在范围内,借用检查器会提示。

要解决此问题,您可以使用自有字符串。

fn main() {
let opt = Some(1);

let opt_display = match opt {
Some(ref x) => format!("{}", x), // Allowed since opt_display now owns the string
None => "".into(),
};
// Another way to achieve the same thing.
//let opt_display = opt.map(|s| format!("{}", s)).unwrap_or("".into());

println!("opt: {}", opt_display);
}

关于rust - 匹配表达式中 format!() 的生命周期太短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com