Rust 为什么“使用”-将特征与重叠方法结合使用会改变类型推断结果?

Rust 为什么“使用”-将特征与重叠方法结合使用会改变类型推断结果?,rust,Rust,我在练习内在的易变性,遇到了我无法解释的行为。考虑下面的代码: 使用std::rc::rc; 使用std::cell::{RefCell,RefMut}; 让共享:Rc=Rc::new(RefCell::new(0)); 让mut借用=共享。借用_mut(); *借用+=1; 它编译并将借用的类型推断为RefMut 但是,如果添加则使用std::borrow::BorrowMut,代码不编译: error[E0368]: binary assignment operation `+=` can

我在练习内在的易变性,遇到了我无法解释的行为。考虑下面的代码:

使用std::rc::rc;
使用std::cell::{RefCell,RefMut};
让共享:Rc=Rc::new(RefCell::new(0));
让mut借用=共享。借用_mut();
*借用+=1;
它编译并将借用的
类型推断为
RefMut

但是,如果添加
则使用std::borrow::BorrowMut,代码不编译:

error[E0368]: binary assignment operation `+=` cannot be applied to type `Rc<RefCell<u8>>`
 --> src/main.rs:9:5
  |
9 |     *borrowed += 1;
  |     ---------^^^^^
  |     |
  |     cannot use `+=` on type `Rc<RefCell<u8>>`
error[E0368]:二进制赋值操作`+=`不能应用于类型`Rc`
-->src/main.rs:9:5
|
9 |*借用+=1;
|     ---------^^^^^
|     |
|无法对类型'Rc'使用'+='`
借用的
类型被推断为
&mut Rc
(如果我理解正确的话)

我看到
RefCell
struct和
BorrowMut
trait都有
borrow\u mut
方法,但我不清楚
如何简单地使用
-ing trait可以改变编译器选择的方法


可能我不知道方法解析在Rust编译器中是如何工作的。有谁能帮助理解它和/或分享解释这些微妙之处的指针吗?

幸运的是,我并不是唯一一个被这一固有规则弄糊涂的人:

关于这个问题的讨论导致添加了我想要的内容,其中基本上列出了编译器执行的步骤,以确定要调用哪个方法。总而言之,
Rc
由于自动取消引用规则,在
RefCell
之前查看类型


编辑#1:(来自@eggyal)


另外,
BorrowMut
是为
Rc
实现的,而达到
RefCell::borrow\u mut
要求首先取消对共享的引用,这具有较低的优先级,因此当
BorrowMut
在范围内时,这就是结束的地方。当然,您可以显式地取消引用以仍然获得原始行为:
(&*shared).borrow_mut()
shared.deref().borrow_mut()
(后者要求
std::ops::deref
在范围内)。

原因!=我告诉你,使用相同的名称会让你感到困惑“我看到RefCell struct和BorrowMut trait都有borrow_mut方法,但我不清楚简单地使用trait如何改变编译器选择的方法。”你可以直接使用use statement来选择使用这个trait,因此。。。使用trait中的函数,而不是结构上的函数。我不懂你不懂的东西。您将trait导入到作用域中,您很惊讶代码现在使用trait函数@Stargateur确切地说,我非常惊讶的是,简单地导入东西会以某种方式改变与此导入无关的对象的名称解析行为。我是新手,所以如果这就是它在这种语言中的工作原理,我真的很想了解更多。到目前为止,我还找不到关于为什么会发生这种情况的正式解释。我想我找到了答案(tl;dr:是的,特征必须在可见的范围内,因此由编译器考虑):而且,尽管达到
RefCell::borrow_mut
要求首先取消对
共享
的引用,它具有较低的优先级,因此当
BorrowMut
在范围内时,您将在该范围内结束。当然,您可以显式地取消引用以仍然获得原始行为:
(&*shared).borrow_mut()
shared.deref().borrow_mut()
(后者要求
std::ops::deref
在范围内)。