Rust provides built-in methods to copy or clone elements when using an iterator.
Eg.
1
let nums: Vec<u32> = nums1.iter().chain(&nums2).copied().collect();
What’s the difference? and when is it useful?
You may have done something like this:
1
let nums: Vec<u32> = nums1.iter().chain(&nums2).map(|x| *x).collect();
but instead, use copied.
1
let nums: Vec<u32> = nums1.iter().chain(&nums2).copied().collect();
Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let nums = vec![1,2,3,4];
let nums2 = vec![5,6,7,8];
// doiing it manually by copying
// let all_nums: Vec<u32> = nums.iter().chain(&nums2).map(|x| *x).collect();
// doiing it manually by cloneing
// let all_nums: Vec<u32> = nums.iter().chain(&nums2).map(|x| x.clone()).collect();
// but why not just use provided functionality ??!
let all_nums: Vec<u32> = nums.iter().chain(&nums2).copied().collect();
// or cloned if copy it is not an option
//let all_nums: Vec<u32> = nums.iter().chain(&nums2).cloned().collect();
assert_eq!(all_nums, vec![1,2,3,4,5,6,7,8]);
Difference between cloned and copied?
Same reasoning aplies as for Copy and Clone traits. Use copied to avoid to accidentally cloing iterator elements. Use copied when possible.