相关疑难解决方法(0)

从Option <String>转换为Option <&str>

我经常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)

rust

56
推荐指数
4
解决办法
7801
查看次数

为什么借临时是合法的?

来自C++,我很惊讶这段代码在Rust中是有效的:

let x = &mut String::new();
x.push_str("Hello!");
Run Code Online (Sandbox Code Playgroud)

在C++中,你不能取一个临时的地址,一个临时的不会比它出现的表达式更长.

临时居住在Rust多久了?既然x只是借用,谁是字符串的所有者?

temporary rust

13
推荐指数
3
解决办法
1254
查看次数

Rust中的空指针优化是什么?

学习Rust中,链接列表完全过多,作者提到:

但是,如果我们有一种特殊的枚举:

enum Foo {
    A,
    B(ContainsANonNullPtr),
}
Run Code Online (Sandbox Code Playgroud)

空指针优化启动,这消除了标签所需的空间.如果变体是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

rust

10
推荐指数
3
解决办法
1634
查看次数

错误 [E0716]:借用时临时值下降(生锈)

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)

rust

3
推荐指数
1
解决办法
2408
查看次数

标签 统计

rust ×4

temporary ×1