gpt4 book ai didi

sorting - 根据设置对具有多个闭包之一的向量进行排序

转载 作者:行者123 更新时间:2023-11-29 08:22:06 24 4
gpt4 key购买 nike

我想编译这段代码:

struct Person {
name: String,
age: u32,
}

fn main() {
let sort_by = "age";

let x = vec![
Person {
name: "Peter".to_string(),
age: 18,
},
Person {
name: "Frank".to_string(),
age: 55,
},
];

let key_func;

if sort_by == "age" {
key_func = |item: &Person| {
return &item.age;
};
} else if sort_by == "name" {
key_func = |item: &Person| {
return &item.name;
};
}

x.sort_by_key(key_func);
}

playground

我知道为什么这不能编译,但我不知道如何解决它。我尝试了几种不同的方法,包括将闭包包装在 Box::new() 中,但我无法让它工作。

起初,我想忽略这个问题,只是将所有排序逻辑(包括条件)移到一个闭包中,但后来我不得不添加一个反向排序选项。因为为了简单起见,我真的很想使用 *_by_key,所以我尝试使用 std::cmp::Reverse,结果发生了:

use std::cmp::Reverse;

fn main() {
let reverse = false;

// ....

let key_func = |item: &Person| {
if reverse {
return Reverse(&item.age);
} else {
return &item.age;
}
};

x.sort_by_key(key_func);
}

playground

同样,我明白为什么会出现错误,但我不确定如何解决。

最佳答案

正如您所认识到的,问题在于 key_func只能有一个特定的类型,但是这两个闭包中的每一个都有不同的类型。

一个是实现 FnMut(&Person) -> &u32 的类型另一个是实现 FnMut(&Person) -> &String 的类型.

即使它们都返回相同的类型,即使它们在语法上完全相同,它们也将是两种不同的类型。这就像尝试做 let num: i32 = if predicate { 0 } else { "thing" } .您可以将它们装箱到具有相同特征的特征对象中,但装箱 FnMut s 很棘手,因为 Box<FnMut...>没有实现 FnMut .

还有一个更根本的问题:你can't use sort_by_key with functions that return references .

您可以做的一件事是使用更通用的 sort_by ,即 FnMut(&T, &T) -> Ordering并有逻辑知道什么Ordering基于哪些字段返回,可能由某种 SortBy 引导如果你真的想枚举。

另一种选择是简单地调用 sort_by_key在分支机构内部,因此 Vec从中排序出来,或者如果你想推迟排序,那么再次维护某种指示符,例如 SortBy枚举,然后在实际需要时使用它来具体执行排序。

关于sorting - 根据设置对具有多个闭包之一的向量进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50495709/

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