Clippy lints / Pedantic
Clippy lint · Pedantic · checked with Clippy 0.1.99
clippy::into_iter_without_iter: This is the opposite of the iter_without_into_iter lint. It looks for IntoIterator for (&|&mut) Type implementations without an inherent iter or iter_mut method on the type or on any of the types in its Deref chain
What it meansThis is the opposite of the iter_without_into_iter lint. It looks for IntoIterator for (&|&mut) Type implementations without an inherent iter or iter_mut method on the type or on any of the types in its Deref chain. It is in the pedantic group and off by default.
Does it matter?
It’s not bad, but having them is idiomatic and allows the type to be used in iterator chains by just calling .iter(), instead of the more awkward <&Type>::into_iter or (&val).into_iter() syntax in case of ambiguity with another IntoIterator impl.
Stricter lints with some false positives. Off by default; opt in with clippy::pedantic.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
struct MySlice<'a>(&'a [u8]);
impl<'a> IntoIterator for &MySlice<'a> {
type Item = &'a u8;
type IntoIter = std::slice::Iter<'a, u8>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
Write this instead
struct MySlice<'a>(&'a [u8]);
impl<'a> MySlice<'a> {
pub fn iter(&self) -> std::slice::Iter<'a, u8> {
self.into_iter()
}
}
impl<'a> IntoIterator for &MySlice<'a> {
type Item = &'a u8;
type IntoIter = std::slice::Iter<'a, u8>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
into_iter_without_iter = "warn"In code
#![warn(clippy::into_iter_without_iter)]One run
cargo clippy -- -W clippy::into-iter-without-iterThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
This is the opposite of the iter_without_into_iter lint.
It looks for IntoIterator for (&|&mut) Type implementations without an inherent iter or iter_mut method
on the type or on any of the types in its Deref chain.
Why is this bad?
It’s not bad, but having them is idiomatic and allows the type to be used in iterator chains
by just calling .iter(), instead of the more awkward <&Type>::into_iter or (&val).into_iter() syntax
in case of ambiguity with another IntoIterator impl.
Limitations
This lint focuses on providing an idiomatic API. Therefore, it will only
lint on types which are accessible outside of the crate. For internal types,
these methods can be added on demand if they are actually needed. Otherwise,
it would trigger the dead_code lint for the unused method.
Example
struct MySlice<'a>(&'a [u8]);
impl<'a> IntoIterator for &MySlice<'a> {
type Item = &'a u8;
type IntoIter = std::slice::Iter<'a, u8>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
Use instead:
struct MySlice<'a>(&'a [u8]);
impl<'a> MySlice<'a> {
pub fn iter(&self) -> std::slice::Iter<'a, u8> {
self.into_iter()
}
}
impl<'a> IntoIterator for &MySlice<'a> {
type Item = &'a u8;
type IntoIter = std::slice::Iter<'a, u8>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- too_many_linesChecks for functions with a large amount of lines
- missing_errors_docChecks the doc comments of publicly visible functions that return a Result type and warns if there is no # Errors section
- must_use_candidateChecks for public functions that have no #[must_use] attribute, but return something not already marked must-use, have no mutable arg and mutate no statics
- index_refutable_slicethis binding can be a slice pattern to avoid indexing
- inefficient_to_stringChecks for usage of .to_string() on an &&T where T implements ToString directly (like &&str or &&String)
- inline_alwaysChecks for items annotated with #[inline(always)], unless the annotated function is empty or simply panics
- invalid_upcast_comparisonsbecause of the numeric bounds on `x` prior to casting, this expression is always false
- ip_constanthand-coded well-known IP address
- items_after_statementsadding items after statements is confusing, since items exist from the start of the scope
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::too_many_linesChecks for functions with a large amount of linesRead it next →Did this answer your question?