mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-10 15:14:29 +00:00
e440065a0f
key idea: for `f` in `.map(f)` and `.for_each(f)`: 1. `f` must be a closure with one parameter 2. don't lint if mutable paramter in clsure `f`: `|mut x| ...` 3. don't lint if parameter is moved
82 lines
2.4 KiB
Rust
82 lines
2.4 KiB
Rust
#![warn(clippy::iter_overeager_cloned, clippy::redundant_clone, clippy::filter_next)]
|
|
#![allow(dead_code, clippy::let_unit_value, clippy::useless_vec)]
|
|
|
|
fn main() {
|
|
let vec = vec!["1".to_string(), "2".to_string(), "3".to_string()];
|
|
|
|
let _: Option<String> = vec.iter().last().cloned();
|
|
|
|
let _: Option<String> = vec.iter().chain(vec.iter()).next().cloned();
|
|
|
|
let _: usize = vec.iter().filter(|x| x == &"2").count();
|
|
|
|
let _: Vec<_> = vec.iter().take(2).cloned().collect();
|
|
|
|
let _: Vec<_> = vec.iter().skip(2).cloned().collect();
|
|
|
|
let _ = vec.iter().filter(|x| x == &"2").nth(2).cloned();
|
|
|
|
let _ = [Some(Some("str".to_string())), Some(Some("str".to_string()))]
|
|
.iter()
|
|
.flatten().cloned();
|
|
|
|
let _ = vec.iter().filter(|&x| x.starts_with('2')).cloned();
|
|
|
|
let _ = vec.iter().find(|&x| x == "2").cloned();
|
|
|
|
{
|
|
let f = |x: &String| x.starts_with('2');
|
|
let _ = vec.iter().filter(|&x| f(x)).cloned();
|
|
let _ = vec.iter().find(|&x| f(x)).cloned();
|
|
}
|
|
|
|
{
|
|
let vec: Vec<(String, String)> = vec![];
|
|
let f = move |x: &(String, String)| x.0.starts_with('2');
|
|
let _ = vec.iter().filter(|&x| f(x)).cloned();
|
|
let _ = vec.iter().find(|&x| f(x)).cloned();
|
|
}
|
|
|
|
fn test_move<'a>(
|
|
iter: impl Iterator<Item = &'a (&'a u32, String)> + 'a,
|
|
target: String,
|
|
) -> impl Iterator<Item = (&'a u32, String)> + 'a {
|
|
iter.filter(move |&(&a, b)| a == 1 && b == &target).cloned()
|
|
}
|
|
|
|
{
|
|
#[derive(Clone)]
|
|
struct S<'a> {
|
|
a: &'a u32,
|
|
b: String,
|
|
}
|
|
|
|
fn bar<'a>(iter: impl Iterator<Item = &'a S<'a>> + 'a, target: String) -> impl Iterator<Item = S<'a>> + 'a {
|
|
iter.filter(move |&S { a, b }| **a == 1 && b == &target).cloned()
|
|
}
|
|
}
|
|
|
|
let _ = vec.iter().map(|x| x.len());
|
|
|
|
// This would fail if changed.
|
|
let _ = vec.iter().cloned().map(|x| x + "2");
|
|
|
|
let _ = vec.iter().for_each(|x| assert!(!x.is_empty()));
|
|
|
|
// Not implemented yet
|
|
let _ = vec.iter().cloned().all(|x| x.len() == 1);
|
|
|
|
// Not implemented yet
|
|
let _ = vec.iter().cloned().any(|x| x.len() == 1);
|
|
|
|
// Should probably stay as it is.
|
|
let _ = [0, 1, 2, 3, 4].iter().cloned().take(10);
|
|
|
|
// `&Range<_>` doesn't implement `IntoIterator`
|
|
let _ = [0..1, 2..5].iter().cloned().flatten();
|
|
}
|
|
|
|
// #8527
|
|
fn cloned_flatten(x: Option<&Option<String>>) -> Option<String> {
|
|
x.cloned().flatten()
|
|
}
|