-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Open
Labels
A-lintArea: New lintsArea: New lints
Description
What it does
As this bug in rust compiler shows, it is easy to implement a non-trivial new()
method, while using #[derive(Default)]
-- thus having two different ways to instantiate a struct, most likely creating bugs. I suspect there is a almost no good use case for the fn new() -> Self
(without parameters) to contain anything other than { Self::default() }
.
Other considerations
- We may want to warn if there is a
fn new()
that returns anything other thanSelf
, likeResult
orOption
or some other type. - This proposal is the reverse of New lint to ensure
Default::default
callsT::new
, rather than vice versa. #12662 idea
Advantage
- keeps
Default
andnew
consistent - prevents bugs due to accidental multiple implementations
Drawbacks
There might be some strange usecase for new
to be different from default. I couldn't come up with one, but I am sure something could exist...
Example
#[derive(Default)]
struct MyStruct(u32);
impl MyStruct {
fn new() -> Self { Self(42) }
}
Could be written as:
impl MyStruct {
fn new() -> Self { Self::default() }
}
Metadata
Metadata
Assignees
Labels
A-lintArea: New lintsArea: New lints