Best practice for fallible constructor, clippy::new_ret_no_self

Hi,
i'm just trying out clippy for the first time, ran it on some code of mine and it made some helpful suggestions that were easy to change :slight_smile:
However, i get

warning: methods called `new` usually return `Self`

at one point where i have a method SomeType::new(a : SomeParameter, b : SomeParameter) -> Result<Self,Error>, where a and b are user inputs into my application, and not every combination of them is valid for constructing a SomeType instance. Is there an established naming convention for constructors that may fail?

Thanks! :slight_smile:

1 Like

You can name it something like from_config, from_params, with_config, with_params, etc. That is, with_ and from_ are commonly used prefixes for constructors that aren’t, essentially, the default one (which is what new usually refers to). But that’s more about taking some arguments rather than being fallible or not.

That said, I’m not sure I agree with this clippy lint and well known crates have many "violations" - eg tokio has plenty of new() that are fallible. So if you can’t come up with an obviously better name, just ignore this lint in that place.

4 Likes

Ok, thanks for the alternate name suggestions, i'll keep them in mind in the future. For this specific instance, i've decided to stick with new and put #[allow(clippy::new_ret_no_self)] above it to disable the lint, because it's really the only sensible way to construct that type.

Thanks :slight_smile:

1 Like

You could also open a clippy issue asking for the lint to allow Option<Self>, Result<Self, _>, impl Future<Output = Self>, etc.

1 Like

Haha, i looked in their bugtracker, and it seems this was fixed in their git just three days ago if i understand that thread correctly :smiley:
https://github.com/rust-lang-nursery/rust-clippy/issues/3313

1 Like