函数签名可减少借用检查器问题

  • 本文关键字:问题 可减少 函数 rust
  • 更新时间 :
  • 英文 :


我正在学习Rust,想知道如何为某个问题建模。让我们假设我有一定数量的具有几个属性的人被建模为一个结构。

struct Person {
available_days: Vec<bool> // [0]=Monday .. [6]=Sunday
possible_roles: Vec<Role>
preferred_role: Role
in_group: bool
... (quite a few more)

我想组建团队,但必须满足要求。例如,每个小组必须有一定数量的角色,他们必须在同一天可用,等等。我尝试了这个签名:

fn build_group(avail_persons: &mut Vec<Person>) -> Option<Group> {...}

这个签名的想法是获得对预选人员向量的引用,并试图找到一个好的组设置。

调用build_group的函数将执行如下操作:

let mut avail_day = persons
.iter()
.filter(|d|d.available_days[0] == 1) // all persons avialable on Monday
.collect::Vec<&Person>>(); 

这将创建Vec<&Person>,而我无法创建Vec<Person>(缺少复制特征(。一个解决方案是将build_group的签名更改为Vec<&Person>,但这意味着我在更改人员时遇到了困难,例如person.in_group=true。在改变为Vec<amp;个人>我经常遇到借款检查器的问题。

我的印象是,我从根本上是以一种不易生锈的方式来建模这个问题。

有什么建议吗?也许是一个github回购的链接,可以处理这类问题。无论如何,我都想从有经验的人那里阅读Rust代码。我希望我能够很好地描述这个问题。

如果personsVec,并且过滤后不再需要它,则可以执行以下操作:

let mut avail_day = persons.retain(|d| d.available_days[0] == 1); // all persons avialable on Monday

CCD_ 6";只保留谓词"指定的元素;。

如果您需要使用其他Person,可以将Vec划分为两个集合:

let (mut avail_day, unavail_day): (Vec<Person>, Vec<Person>) = persons
.into_iter()
// ^^^^^ note the "into" here
.partition(|d| d.available_days[0] == 1); // all persons avialable on Monday

into_iter按值而不是按引用获取Vec,并允许您再次将其收集为值。

顺便说一句,在Rust中,如果你引用你的论点,即签名应该是,那么最好取一个切片,而不是Vec

fn build_group(avail_persons: &mut [Person]) -> Option<Group> {...}

通过这种方式,您可以传入任何可以转换为切片的内容(如Vecs(。

最新更新