gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:48:21 28 4
gpt4 key购买 nike

我首先要说我对 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com