为什么在RefCell上使用borrow()时,使用Borrow in Rust创建局部绑定会导致无法推断类型?

vpfxa7rd  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(120)

我尝试从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()一样正常工作。应该做些什么来不可改变地借用?

mrfwxfqh

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)。

相关问题