对元组向量进行排序需要第二个值的引用吗?
发布时间:2020-12-14 06:02:48 所属栏目:Java 来源:网络整理
导读:我有一个整数元组的向量,并希望通过每个元组的第二个元素对其进行排序: 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)的
我有一个整数元组的向量,并希望通过每个元组的第二个元素对其进行排序:
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.
这是一个更有趣的问题;-) 简单的解决方案就是,. (点)运算符执行自动解除引用以及自动借用.让我们看看它的实际效果: 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(); } 所以 .运算符可以帮助程序员并始终传递正确的自我参数. 注意:你做的排序很常见.有一种方法更适合这项任务: // note: type annotations not required let mut tuple_list2 = vec![(1,2)]; tuple_list2.sort_by_key(|k| k.1); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |