对元组向量进行排序需要第二个值的引用吗?

我有一个整数元组的向量,并希望通过每个元组的第二个元素对其进行排序:
fn main() {
    let mut tuple_list2: Vec<(u16,u16)> = vec![(1,5),(0,17),(8,2)];
    tuple_list2.sort_by(|a,b| a.1.cmp(b.1));
}

编译器抛出一个错误,因为b.1是一个u16而不是对一个(& u16)的引用.我可以通过引用b.1来解决这个问题:

fn main() {
    let mut tuple_list2: Vec<(u16,b| a.1.cmp(&b.1));
}

我不明白我为什么要这样做.特别是因为我也不需要引用a.1.

解决方法

正如aurora0001已经在评论中指出的那样,我们应该看看 the function signature of cmp()
fn cmp(&self,other: &Self) -> Ordering

我们看到这两个值都是通过引用来获取的,所以你不得不将& b.1传递给方法而不是b.1.

Especially because I do not need to reference a.1,either.

这是一个更有趣的问题;-)

简单的解决方案就是,. (点)运算符执行自动解除引用以及自动借用.让我们看看它的实际效果

struct Foo;

impl Foo {
    fn takes_value(self) {}
    fn takes_ref(&self) {}
    fn takes_mut_ref(&mut self) {}
}

fn main() {
    let mut a = Foo;

    // all of those work thanks to auto-borrowing
    a.takes_ref();
    a.takes_mut_ref();
    a.takes_value();

    // --------
    let b = Foo;
    let c = &mut b;

    // these work as well
    c.takes_ref();
    c.takes_mut_ref();

    // this one works,*if* the type implements `copy`
    c.takes_value();
}

所以 .运算符可以帮助程序员并始终传递正确的自我参数.

注意:你做的排序很常见.有一种方法更适合这项任务:[T]::sort_by_key().它看起来像这样:

// note: type annotations not required
let mut tuple_list2 = vec![(1,2)];
tuple_list2.sort_by_key(|k| k.1);

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...