代码
use chrono;
fn main() {
let msg = std::format!("some msg :{}", 123);
output_msg(msg.as_str());
let msg = std::format!("some msg :{}", 123);
let msg = msg.as_str();
output_msg(msg);
let msg = std::format!("some msg :{}", 123).as_str();
output_msg(msg);
}
fn output_msg(msg: &str) {
println!(
"{}:{}",
chrono::Local::now().format("%F %T").to_string(),
msg
)
}
问题
第11、12行是报错的。编译器提示我 temporary value dropped while borrowed consider using a let
binding to create a longer lived 。
它的工作模式不应该和 7、8、9行相同嘛?
1
共 7 条评论, 1 页
评论区
写评论谢谢
--
👇
苦瓜小仔: 仅对此例,你还可以这么做:
这用到了 Temporary lifetime extension 和 coercions
BTW
chrono::Local::now().format("%F %T").to_string()
可以简化为chrono::Local::now().format("%F %T")
,cargo clippy
会提示你的。仅对此例,你还可以这么做:
这用到了 Temporary lifetime extension 和 coercions
BTW
chrono::Local::now().format("%F %T").to_string()
可以简化为chrono::Local::now().format("%F %T")
,cargo clippy
会提示你的。错误提示了
嗯,谢谢啦!
--
👇
eweca-d: 我只知道类似"let x = T.XXX()"这种的,T如果没有实现COPY,在这行代码之后T都会作为临时变量直接被drop掉。所以你这么写肯定是有问题的,x会变成一个类似悬垂指针的东西。我是一直知道有这么个东西,但是不知道为啥当初这么设计。
###理解了,谢谢
--
👇
Neutron3529:
std::format!("some msg :{}", 123)
的意思是生成一个临时变量,按Rust,如果不保存,不消费这个变量,它会在分号处drop这个临时变量drop之后,指向它的as_str()返回值也就失效了
我只知道类似"let x = T.XXX()"这种的,T如果没有实现COPY,在这行代码之后T都会作为临时变量直接被drop掉。所以你这么写肯定是有问题的,x会变成一个类似悬垂指针的东西。我是一直知道有这么个东西,但是不知道为啥当初这么设计。
std::format!("some msg :{}", 123)
的意思是生成一个临时变量,按Rust,如果不保存,不消费这个变量,它会在分号处drop这个临时变量drop之后,指向它的as_str()返回值也就失效了