我正在Display::fmt为我自己的struct 实现一个自定义的自定义.
struct Range<T> {
lower: Option<T>,
upper: Option<T>,
}
Run Code Online (Sandbox Code Playgroud)
范围可以是Range { lower: Some(1), upper: None },这意味着它包含从1到无穷大(或i32我想象的极限)的所有整数.
我想实现Display::fmt使用T's Display::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>
Run Code Online (Sandbox Code Playgroud)
我已经开始实现了,但是在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);
}
Run Code Online (Sandbox Code Playgroud)
为什么我的方法不起作用,什么是我的问题的一个很好的解决方案?
小智 5
我不是终身专家,但我相信这里的问题是你试图&String从比赛中的一个String创造出来format!.由于格式的范围仅在范围内,借用检查员会抱怨.
要解决此问题,您可以使用拥有的字符串.
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);
}
Run Code Online (Sandbox Code Playgroud)