我经常Option<String>从计算中获得一个,我想使用这个值或默认的硬编码值.
这对于一个整数来说是微不足道的:
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
Run Code Online (Sandbox Code Playgroud)
但是使用a String和a &str,编译器会抱怨类型不匹配:
let opt: Option<String> = Some("some value".to_owned());
let value = opt.unwrap_or("default string");
Run Code Online (Sandbox Code Playgroud)
这里的确切错误是:
error[E0308]: mismatched types
--> src/main.rs:4:31
|
4 | let value = opt.unwrap_or("default string");
| ^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: try using a conversion method: `"default string".to_string()`
|
= note: expected type `std::string::String`
found type `&'static str`
Run Code Online (Sandbox Code Playgroud)
一种选择是将字符串切片转换为拥有的String,如rustc所示:
let value …Run Code Online (Sandbox Code Playgroud) 来自C++,我很惊讶这段代码在Rust中是有效的:
let x = &mut String::new();
x.push_str("Hello!");
Run Code Online (Sandbox Code Playgroud)
在C++中,你不能取一个临时的地址,一个临时的不会比它出现的表达式更长.
临时居住在Rust多久了?既然x只是借用,谁是字符串的所有者?
在学习Rust中,链接列表完全过多,作者提到:
但是,如果我们有一种特殊的枚举:
Run Code Online (Sandbox Code Playgroud)enum Foo { A, B(ContainsANonNullPtr), }空指针优化启动,这消除了标签所需的空间.如果变体是
A,整个枚举设置为全部0.否则,变体是B.这是有效的,因为它B永远不会全部0,因为它包含一个非零指针.
我想作者说的是(假设A是4位,B是4位)
let test = Foo::A
Run Code Online (Sandbox Code Playgroud)
内存布局是
0000 0000
Run Code Online (Sandbox Code Playgroud)
但
let test = Foo::B
Run Code Online (Sandbox Code Playgroud)
内存布局是
some 8 bit non 0 value
Run Code Online (Sandbox Code Playgroud)
究竟在这里优化了什么?两种表示都不总是8位当作者声称时它是什么意思
这意味着
&,&mut,Box,Rc,Arc,Vec,并把在当鲁斯特其他几个重要的类型有没有开销Option
tl;drerror[E0716]: temporary value dropped while borrowed是一个困难且常见的问题,有一致的解决方案吗?
我遇到了困难的 rustc 错误
error[E0716]: temporary value dropped while borrowed
...
creates a temporary which is freed while still in use
Run Code Online (Sandbox Code Playgroud)
搜索Stackoverflow,有很多关于这个rust error的问题error[E0716]。
也许 Rust 专家可以为这个常见的新手问题提供一个通用的解决方案,一个足够好的解决方案,它也可以回答链接的问题(见下文)。
一个简洁的代码示例来演示该问题(Rust Playground):
type Vec1<'a> = Vec::<&'a String>;
fn fun1(s1: &String, v1: &mut Vec1) {
v1.insert(0, &s1.clone());
}
fn main() {
let mut vec1 = Vec::new();
let str1 = String::new();
fun1(&str1, &mut vec1);
}
Run Code Online (Sandbox Code Playgroud)
结果:
error[E0716]: temporary value dropped while borrowed
--> …Run Code Online (Sandbox Code Playgroud)