rust 当使用as_str()时,请考虑使用let绑定来创建更长的值

rjee0c15  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(120)

当我在Rust中使用这段代码时:

fn main() {
    let s = String::from("hello").as_str();
    println!("slice: {}", s); 
}

字符串
编译器显示错误:

temporary value dropped while borrowed
creates a temporary value which is freed while still in userustcClick for full compiler diagnostic
main.rs(2, 43): temporary value is freed at the end of this statement
main.rs(3, 27): borrow later used here
main.rs(2, 5): consider using a `let` binding to create a longer lived value: `let binding = String::from("hello");
`, `binding`


as_str是否没有复制值?我认为s将活到主函数结束。为什么还要说那个万岁的问题呢?

fykwrbwg

fykwrbwg1#

as_str是否没有复制值?
不,这正是String&str之间的区别。String拥有值,&str只是引用。&str不能拥有值,它只引用String。由于您没有将String存储在变量中,因此当&str仍然存在时,它会被删除,从而导致错误。
你的代码相当于这个:

fn main() {
    let x: String = String::from("hello");
    let s: &str = x.as_str();
    drop(x);
    println!("slice: {}", s);
}

个字符
如果将String存储在变量中,它可以正常工作:

fn main() {
    let x: String = String::from("hello");
    let s: &str = x.as_str();
    println!("slice: {}", s);
}
slice: hello

的字符串
关于Stringstr的区别的更多信息可以在这里找到:What are the differences between Rust's String and str?

相关问题