fn main() {
let s = "Hello, world!".to_string().as_str();
println!("{}", s);
}
这个代码是无法通过编译的,提示如下:
error[E0716]: temporary value dropped while borrowed
--> src\main.rs:2:13
|
2 | let s = "Hello, world!".to_string().as_str();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
3 | println!("{}", s);
| - borrow later used here
|
= note: consider using a `let` binding to create a longer lived value
评论区
写评论不用怀疑,其实直接构筑例子是很容易的,如下:
这个代码是无法通过编译的,提示如下:
在这里,
to_string()
函数返回的是String
,它没有被绑定到任何变量上,然后却直接被函数as_str()
使用。注意,这里as_str()
接收的是一个&String
,所以按道理String
没有被消耗掉。之后生成的是&str
,最后&str
被绑定到变量s
上。显然语句结束后,String
被释放了,从而导致&str
这个引用指向为一个被释放的内存,所以编译器发生错误。注意的是:
as_str()
不会消耗String
;编译器提示,临时变量是在声明结束的时候被释放的。就是像他所说的,会创建一个临时变量,然后该行语句结束直接被释放掉。
--
👇
TD-Sky: 谢谢回答!权威指南里有说吗?我当前读的章节找不到。
--
👇
viruscamp: 调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量
看权威指南(The Book)就不要钻牛角尖。要相信 rust 不会在这么常见且简单的情况下出错。
要当语言律师至少要看 The Reference
https://doc.rust-lang.org/stable/reference/expressions.html#temporaries 这一章
谢谢回答!权威指南里有说吗?我当前读的章节找不到。
--
👇
viruscamp: 调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量
调用函数会有一个临时变量拥有返回的值, 语句结束后 drop 此临时变量