Do you need a reference to the second value to sort tuple vectors?
I have a vector of integer tuples and want to sort them by the second element of each tuple:
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)); }
The compiler throws an error because B.1 is a U16 rather than a reference to a (& U16) I can solve this problem by quoting B.1:
fn main() { let mut tuple_list2: Vec<(u16,b| a.1.cmp(&b.1)); }
I don't understand why I did it Especially because I don't need to quote a.1
Solution
As aurora0001 has pointed out in his comments, we should look at the function signature of cmp():
fn cmp(&self,other: &Self) -> Ordering
We see that both values are obtained by reference, so you have to pass & B.1 to the method instead of B.1
This is a more interesting question; -)
The simple solution is The (DOT) operator performs automatic dereference and automatic borrowing Let's look at its actual effect:
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(); }
So Operator can help programmers and always pass correct self parameters
Note: the sort you do is very common There is a better method for this task: [t]: sort_ by_ key(). It looks like this:
// note: type annotations not required let mut tuple_list2 = vec![(1,2)]; tuple_list2.sort_by_key(|k| k.1);