相关疑难解决方法(0)

为什么我不能使用在使用sort_by_key排序向量时返回引用的键函数?

我正在尝试Vec<String>使用键函数对其进行排序,该函数返回对向量中字符串的引用.一个人为的例子是使用身份函数作为关键函数(当然这是无用的,但它是重现我的问题的最小例子):

fn key(x: &String) -> &String {
    x
}
Run Code Online (Sandbox Code Playgroud)

现在items: Vec<String>,我希望能够做到

items.sort_by_key(key);
Run Code Online (Sandbox Code Playgroud)

这会出现以下错误:

error[E0271]: type mismatch resolving `for<'r> <fn(&std::string::String) -> &std::string::String {main::key} as std::ops::FnOnce<(&'r std::string::String,)>>::Output == _`
  --> src/main.rs:19:11
   |
19 |     items.sort_by_key(key);
   |           ^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime
   |
   = note: concrete lifetime that was found is lifetime '_#16r
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我会收到这个错误,所以我试着追踪这个错误.我首先实现了我自己的版本sort_by_key():

fn sort_by_key<T, K: Ord>(a: &mut [T], key: fn(&T) -> K) {
    a.sort_by(|x, y| key(x).cmp(&key(y)));
}
Run Code Online (Sandbox Code Playgroud)

当试图调用这个函数时,我看到的是"相反"的错误:

error[E0308]: mismatched types
  --> …
Run Code Online (Sandbox Code Playgroud)

generics lifetime rust

11
推荐指数
1
解决办法
421
查看次数

如何按 2 个或多个字段对结构体 Vec 进行排序?

example

struct MyStruct{
    row: u8,
    column: u8
}

let my_vector = a Vec<MyStruct> with like 100 items in it
Run Code Online (Sandbox Code Playgroud)

可以说我有一个像这样的简单设置^。我想my_vector按行然后按列对 100 个项目的列表进行排序,这样我的向量就会看起来像sample 1而不是sample 2.

sample 1

my_vector = vec![
MyStruct { row: 10, column: 1 },
MyStruct { row: 10, column: 2 },
MyStruct { row: 10, column: 3 }, ]
Run Code Online (Sandbox Code Playgroud)

sample 2

my_vector = vec![
MyStruct { row: 10, column: 3 },
MyStruct { row: 10, column: 1 },
MyStruct { row: 10, …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
3
解决办法
6273
查看次数

标签 统计

rust ×2

generics ×1

lifetime ×1