我正在学习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代码。我希望我能够很好地描述这个问题。
如果persons
是Vec
,并且过滤后不再需要它,则可以执行以下操作:
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> {...}
通过这种方式,您可以传入任何可以转换为切片的内容(如Vec
s(。