Rc :: deref会返回引用吗?

时间:2018-01-21 03:49:43

标签: rust

以下代码:

use std::rc::Rc;

fn main() {
    let s = Rc::new(String::from("Hello"));
    let o: &String = *s;
}

给我这个错误:

  = note: expected type `&std::string::String`
             found type `std::string::String`

我希望*s会提供某种参考,因为deref签名是fn deref(&self) -> &T

让我感到困惑的一件事是,如果我将let o行更改为:

let o: String = *s;

我现在收到cannot move out of borrowed content的错误。

所以我有两个相关的问题

  1. 为什么*s的Rc值不会返回引用?
  2. 我理解如何移动引用,*s如何借用,而不是引用?我以为这些话意味着同样的事情?

1 个答案:

答案 0 :(得分:4)

*s未扩展为s.deref(),它会扩展为*(s.deref())。那是因为*运算符的主要功能是取消引用指针。直观地说,你会期望*s不返回指针(除非s是指向指针的指针),s是普通指针还是智能指针。这种扩张保留了直觉。