Bja*_*sen 8 string scope temporary lifetime rust
我遇到了这个问题format!,据我所知,在一个没有锚定到任何东西的模式中创建一个临时值。
let x = 42;
let category = match x {
0...9 => "Between 0 and 9",
number @ 10 => format!("It's a {}!", number).as_str(),
_ if x < 0 => "Negative",
_ => "Something else",
};
println!("{}", category);
Run Code Online (Sandbox Code Playgroud)
在这段代码中, 的类型category是 a &str,它通过返回一个像 的文字来满足"Between 0 and 9"。如果我想使用 将匹配的值格式化为切片as_str(),则会出现错误:
let x = 42;
let category = match x {
0...9 => "Between 0 and 9",
number @ 10 => format!("It's a {}!", number).as_str(),
_ if x < 0 => "Negative",
_ => "Something else",
};
println!("{}", category);
Run Code Online (Sandbox Code Playgroud)
我做了一些阅读,发现有类似问题的人,但我似乎找不到任何解决方案。
一个简单的解决方法是category使用 aString而不是 a &str,但我不喜欢必须将.to_string()模式中的每个文字放在末尾的想法,因为它不那么干净。
有没有办法解决这个问题,还是我只需要解决它?
这是Return local String as a slice (&str) 的90% 的副本,请参阅其他多个解决方案。
还有一种额外的可能性,因为这一切都在一个函数中:您可以为 声明一个变量,String并且仅在需要分配时才设置它。编译器(斜)建议:
考虑使用
let绑定来创造更长久的价值
fn main() {
let x = 42;
let tmp;
let category = match x {
0...9 => "Between 0 and 9",
number @ 10 => {
tmp = format!("It's a {}!", number);
&tmp
}
_ if x < 0 => "Negative",
_ => "Something else",
};
println!("{}", category);
}
Run Code Online (Sandbox Code Playgroud)
这与使用 a 大致相同Cow,只是由编译器处理而不是特定类型。
也可以看看:
| 归档时间: |
|
| 查看次数: |
2502 次 |
| 最近记录: |