我尝试从RefCell中借用:
use std::cell::RefCell;
use std::borrow::Borrow;
use std::rc::Rc;
let k = Some(Rc::new(RefCell::new(5)));
let what = k.as_ref().unwrap().clone();
let kk = what.borrow_mut();
它起作用了,但这个不行
let k = Some(Rc::new(RefCell::new(5)));
let what = k.as_ref().unwrap().clone();
let kk = what.borrow();
错误信息也无济于事:
error[E0283]: type annotations needed for `&Borrowed`
--> src/bin/a.rs:404:19
|
404 | let kk = what.borrow();
| -- ^^^^^^ cannot infer type for type parameter `Borrowed` declared on the trait `Borrow`
| |
| consider giving `kk` the explicit type `&Borrowed`, where the type parameter `Borrowed` is specified
|
= note: multiple `impl`s satisfying `Rc<RefCell<i32>>: Borrow<_>` found in the following crates: `alloc`, `core`:
- impl<T> Borrow<T> for Rc<T>
where T: ?Sized;
- impl<T> Borrow<T> for T
where T: ?Sized;
我不明白为什么当我创建一个带有Borrow
trait的本地绑定时,使用borrow()
不能像borrow_mut()
一样正常工作。应该做些什么来不可改变地借用?
1条答案
按热度按时间mrfwxfqh1#
由于您导入了
Borrow
,而borrow_mut()
引用RefCell
的固有方法,因此borrow()
调用Rc
上的Borrow::borrow()
(它优先,因为它直接在Rc
上,而不是通过Deref
到达RefCell
)。如果您打算使用RefCell::borrow()
,删除Borrow
的导入或使用完全限定形式:如果您打算使用Borrow::borrow()
(我不建议这样做,它是为泛型设计的),您需要指定预期的类型,因为Borrow
是泛型,并且一个类型可以被借用为多个类型(对于Rc<T>
-Rc<T>
、&Rc<T>
和T
)。