以下代码:
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
的错误。
所以我有两个相关的问题
*s
的Rc值不会返回引用?*s
如何借用,而不是引用?我以为这些话意味着同样的事情?答案 0 :(得分:4)
*s
未扩展为s.deref()
,它会扩展为*(s.deref())
。那是因为*
运算符的主要功能是取消引用指针。直观地说,你会期望*s
不返回指针(除非s
是指向指针的指针),s
是普通指针还是智能指针。这种扩张保留了直觉。