about summary refs log tree commit diff
path: root/src/liballoc/tests
diff options
context:
space:
mode:
authorAnders Kaseorg <andersk@mit.edu>2017-07-03 17:18:01 -0400
committerAnders Kaseorg <andersk@mit.edu>2017-07-03 18:38:53 -0400
commitd68c3ab17b6f6c3b71d0531063aec8e64098f59c (patch)
treea0982968fd07326593d8a54b5e38d59c309fb3a2 /src/liballoc/tests
parent734c83642cff23f0d9b4b8f006b05437697bcd91 (diff)
downloadrust-d68c3ab17b6f6c3b71d0531063aec8e64098f59c.tar.gz
rust-d68c3ab17b6f6c3b71d0531063aec8e64098f59c.zip
Document unintuitive argument order for Vec::dedup_by relation
When trying to use dedup_by to merge some auxiliary information from
removed elements into kept elements, I was surprised to observe that
vec.dedup_by(same_bucket) calls same_bucket(a, b) where b appears
before a in the vector, and discards a when true is returned.  This
argument order is probably a bug, but since it has already been
stabilized, I guess we should document it as a feature and move on.

(Vec::dedup also uses == with this unexpected argument order, but I
figure that’s not important since == is expected to be symmetric with
no side effects.)

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Diffstat (limited to 'src/liballoc/tests')
-rw-r--r--src/liballoc/tests/vec.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/liballoc/tests/vec.rs b/src/liballoc/tests/vec.rs
index fdf453b39cf..17f1229c206 100644
--- a/src/liballoc/tests/vec.rs
+++ b/src/liballoc/tests/vec.rs
@@ -274,6 +274,11 @@ fn test_dedup_by() {
     vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
 
     assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
+
+    let mut vec = vec![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
+    vec.dedup_by(|a, b| a.0 == b.0 && { b.1 += a.1; true });
+
+    assert_eq!(vec, [("foo", 3), ("bar", 12)]);
 }
 
 #[test]