rust - 为什么在尝试获取对装箱值的引用时得到预期类型 `()`?

标签 rust borrow-checker

我有这个结构:

pub struct Node<T> {
    value: T,
    left: Option<Box<Node<T>>>,
    right: Option<Box<Node<T>>>,
}

impl<T> Node<T> {
    pub fn getLeft(&self) -> Option<&Self> {
        if self.left.is_some() {
            Some(&(*(self.left.unwrap())))
            // Some(self.left.unwrap()) <= same result
        }
        None
    }
}

fn main() {}

出现此错误时似乎存在类型不匹配:

error[E0308]: mismatched types
  --> src/main.rs:10:13
   |
10 |             Some(&(*(self.left.unwrap())))
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found enum `std::option::Option`
   |
   = note: expected type `()`
              found type `std::option::Option<&Node<T>>`

我是 Rust 新手,不明白为什么预期类型是 ()虽然它应该是 Option<&Self>以及如何返回对框内节点的引用(如何移出借用的自身)?

最佳答案

这里的问题不是借用检查器。如果你有一个 if 而没有 else,你必须返回单元( ())。您正在尝试从函数返回一个值,这意味着您需要有一个 else 分支,或者使用 return。即:

impl<T> Node<T> {
    pub fn getLeft(&self) -> Option<&Self> {
        if self.left.is_some() {
            Some(&(*(self.left.unwrap())))
        } else {
            None
        }
    }
}

好的,现在借用检查器出了问题。这是因为您引用了一个临时对象(self.left.unwrap() 的结果)。您需要访问Option 的内容而不 移动它。所以让我们这样做:

impl<T> Node<T> {
    pub fn getLeft(&self) -> Option<&Self> {
        if self.left.is_some() {
            Some(&(*(self.left.as_ref().unwrap())))
        } else {
            None
        }
    }
}

这样更好,但它很丑。有 unwrap,加上多余的括号,这个名字不合惯用语,最后整个分支本身是不必要的。让我们解决所有这些问题:

impl<T> Node<T> {
    pub fn get_left(&self) -> Option<&Self> {
        self.left.as_ref().map(|l| &**l)
    }
}

或者,如果您想要更清楚的内容:

impl<T> Node<T> {
    pub fn get_left(&self) -> Option<&Self> {
        if let Some(left) = self.left.as_ref() {
            Some(&**left)
        } else {
            None
        }
    }
}

关于rust - 为什么在尝试获取对装箱值的引用时得到预期类型 `()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373573/

相关文章:

rust - 返回迭代器时仍然借用 chunks()

rust - 展开时无法移出共享引用后面的值

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何使用普通引用创建一个简单的父子结构?

function - Rust 中的绝对值函数

rust - 自动转发操作,同时保持结果包装

rust - 数组作为结构字段

rust - 如何解决 [E0382] : use of moved value in a for loop?

rust - 为什么 "match"与 Rust 中的确切代码不匹配?

rust - 如何在 Rust 中访问复杂枚举类型的元素?