rust - 对多个方法参数使用相同的引用

标签 rust borrow-checker

我首先要说我对 Rust 很陌生,而且我仍然在思考借用检查器的语义。我对它为什么不喜欢我的代码有所了解,但我不确定如何以惯用的方式解决它。
我在 Rust 中有一个方法,它接受 3 个参数,其签名看起来像这样:

fn do_something(&mut self, mem: &mut impl TraitA, bus: &mut impl TraitB, int_lines: &impl TraitC) -> ()
我还有一个 struct它实现了所有这三个特征;但是,当我尝试对多个参数使用相同的引用时,借用检查器会提示:
cannot borrow `*self` as mutable more than once at a time
并且:
cannot borrow `*self` as immutable because it is also borrowed as mutable
我的第一个问题是这是否是借用检查器的缺点(无法识别正在传递相同的引用),还是设计使然(我怀疑是这种情况,因为从被调用方法的角度来看,每个引用都是不同的,因此每个人的所有权可以单独考虑)。
我的第二个问题是惯用的方法是什么。我看到的两个解决方案是:
a) 将所有三个特征合二为一。尽管考虑到我的库的设计,这在技术上是微不足道的,但由于这三个特征用于与 struct 的不相关部分进行交互,因此它会使代码明显不那么干净。的状态。此外,由于这是一个库(do_something 方法是测试的一部分),它阻碍了将状态分离为单独的 struct 的可能性。 s。
b) 移动 struct 的各个部分的状态变成单独的struct s,然后归主 struct 所有.这对我来说似乎是更好的选择,特别是因为它不需要对库代码本身进行任何更改。
如果我缺少其他解决方案,或者是否有办法说服借阅检查员接受我的原始设计,请告诉我。

最佳答案

借位检查器按设计运行。它只知道你将三个不同的可变引用传递给同一个函数:它不知道函数将如何处理这些,即使它们碰巧是对同一个结构的引用。在函数中,它们是对同一结构的三个不同的可变引用。
如果三个不同的特征代表三个不同的功能方面,那么您最好的方法可能是将结构拆分为不同的结构,每个都实现一个特征,如您所建议的。
如果您希望保留单个结构,并且始终使用单个结构调用该函数,那么您可以像这样将其传递一次:

fn do_something(&mut self, proc: &mut (impl TraitA + TraitB + TraitC)) -> () { ... }

关于rust - 对多个方法参数使用相同的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62685508/

相关文章:

rust - 在procmacro中的所有字段和子字段上递归调用函数

c++ - 无法使 rustc 使用 simd 指令进行包含范围循环

rust - 为什么 rust crate openssl-sys 不编译?

generics - 如何解决特征的通用实现(一揽子实现)的冲突?

rust - 为什么对 const 进行静态引用会返回对临时变量的引用?

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何指定特征迭代器?

rust - 在一个表达式中两次借用 self 有时会导致错误

rust - 使用包含借用参数的结构

rust - 为什么解构借用的枚举需要取消引用其字段?