< 返回版块

xh1109 发表于 2022-07-25 15:43

代码

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行相同嘛?

评论区

写评论
作者 xh1109 2022-07-26 13:24

谢谢

--
👇
苦瓜小仔: 仅对此例,你还可以这么做:

let msg = &std::format!("some msg :{}", 123); // msg: &String
output_msg(msg); // coercions: mes -> &str

这用到了 Temporary lifetime extensioncoercions

BTW chrono::Local::now().format("%F %T").to_string() 可以简化为 chrono::Local::now().format("%F %T")cargo clippy 会提示你的。

苦瓜小仔 2022-07-25 21:20

仅对此例,你还可以这么做:

let msg = &std::format!("some msg :{}", 123); // msg: &String
output_msg(msg); // coercions: mes -> &str

这用到了 Temporary lifetime extensioncoercions

BTW chrono::Local::now().format("%F %T").to_string() 可以简化为 chrono::Local::now().format("%F %T")cargo clippy 会提示你的。

gorust21 2022-07-25 16:43

错误提示了

作者 xh1109 2022-07-25 16:37

嗯,谢谢啦!

--
👇
eweca-d: 我只知道类似"let x = T.XXX()"这种的,T如果没有实现COPY,在这行代码之后T都会作为临时变量直接被drop掉。所以你这么写肯定是有问题的,x会变成一个类似悬垂指针的东西。我是一直知道有这么个东西,但是不知道为啥当初这么设计。

作者 xh1109 2022-07-25 16:37

###理解了,谢谢

--
👇
Neutron3529: std::format!("some msg :{}", 123)的意思是生成一个临时变量,按Rust,如果不保存,不消费这个变量,它会在分号处drop

这个临时变量drop之后,指向它的as_str()返回值也就失效了

eweca-d 2022-07-25 15:57

我只知道类似"let x = T.XXX()"这种的,T如果没有实现COPY,在这行代码之后T都会作为临时变量直接被drop掉。所以你这么写肯定是有问题的,x会变成一个类似悬垂指针的东西。我是一直知道有这么个东西,但是不知道为啥当初这么设计。

Neutron3529 2022-07-25 15:56

std::format!("some msg :{}", 123)的意思是生成一个临时变量,按Rust,如果不保存,不消费这个变量,它会在分号处drop

这个临时变量drop之后,指向它的as_str()返回值也就失效了

1 共 7 条评论, 1 页