相关疑难解决方法(0)

为什么借入仍然存在于if的else块中?

为什么self.f2()以下代码中的调用会使借用检查程序运行?是不是在另一个范围内的else块?这是一个相当难的问题!

use std::str::Chars;

struct A;

impl A {
    fn f2(&mut self) {}

    fn f1(&mut self) -> Option<Chars> {
        None
    }

    fn f3(&mut self) {
        if let Some(x) = self.f1() {

        } else {
            self.f2()
        }
    }
}

fn main() {
    let mut a = A;
}
Run Code Online (Sandbox Code Playgroud)

操场

error[E0499]: cannot borrow `*self` as mutable more than once at a time
  --> src/main.rs:16:13
   |
13 |         if let Some(x) = self.f1() {
   |                          ---- first mutable borrow occurs here
... …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
2
解决办法
2384
查看次数

如何重用我已移出值的框?

我有一些不可复制的类型和一个消耗和(可能)生成它的函数:

type Foo = Vec<u8>;

fn quux(_: Foo) -> Option<Foo> {
    Some(Vec::new())
}
Run Code Online (Sandbox Code Playgroud)

现在考虑一种在概念上非常类似的类型Box:

struct NotBox<T> {
    contents: T
}
Run Code Online (Sandbox Code Playgroud)

我们可以编写一个临时移出内容的函数,NotBox并在返回之前放回一些东西:

fn bar(mut notbox: NotBox<Foo>) -> Option<NotBox<Foo>> {
    let foo = notbox.contents; // now `notbox` is "empty"
    match quux(foo) {
        Some(new_foo) => {
            notbox.contents = new_foo; // we put something back in
            Some(notbox)
        }
        None => None
    }
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个与Boxes 一起使用的类似函数,但编译器不喜欢它:

fn baz(mut abox: Box<Foo>) -> Option<Box<Foo>> {
    let foo = *abox; // now …
Run Code Online (Sandbox Code Playgroud)

boxing ownership-semantics move-semantics rust

9
推荐指数
2
解决办法
1577
查看次数

解除引用Box <T>返回值而不是引用

我似乎无法弄清楚原因:

let a = Box::new(5i32);
let _:() = *a;
Run Code Online (Sandbox Code Playgroud)

告诉我,第二行的指定类型是,i32而不是&i32因为Deref.deref()(我假设被调用*a),返回&T.

另外,如果我打电话给deref()自己:

let _:() = <Box<i32> as Deref>::deref(&a);
Run Code Online (Sandbox Code Playgroud)

我得到了预期&i32.

rust

4
推荐指数
2
解决办法
1324
查看次数