Which of these code styles do you find preferable?
First option using mut with constructor in the beginning:
let mut post_form = PostInsertForm::new(
data.name.trim().to_string(),
local_user_view.person.id,
data.community_id,
);
post_form.url = url.map(Into::into);
post_form.body = body;
post_form.alt_text = data.alt_text.clone();
post_form.nsfw = data.nsfw;
post_form.language_id = language_id;
Second option without mut and constructor at the end:
let post_form = PostInsertForm {
url: url.map(Into::into),
body,
alt_text: data.alt_text.clone(),
nsfw: data.nsfw,
language_id,
..PostInsertForm::new(
data.name.trim().to_string(),
local_user_view.person.id,
data.community_id,
)
};
You can see the full PR here: https://github.com/LemmyNet/lemmy/pull/5037/files
Definitely the second one.
100% the second one. It’s the idiomatic way to do this in Rust, and it leaves you with an immutable object.
I personally like to move the short declarations together (i.e. body down with language_id (or both at the top)) but that’s a minor quibble.
Neither.
new()
give you a fully valid and usable struct value.Maybe you should also use substructs that hold some of the info.
We recently used TypedBuilder (which is builder pattern), but switched to DeriveNew, as its a bit cleaner, and requires less generated code.
Defo the second one, the first is weird imo
Second one if a constructor or a builder is not an option. 1 is out of the question.
Why are the Lemmy devs asking for this though?
@DemocratPostingSucks@lemm.ee @Deebster@programming.dev @al4s@feddit.org Thanks for the feedback! Personally I prefer the first option, but based on your comments I will merge the PR with the second option.
If you’re ever forced to do something the second way, you can also wrap it in braces, that way you end up with an immutable value again:
Why not just a
let app = app;
line after thelet mut app = ...;
one?Thats even more verbose so the second option is better.
Yeah if you have the second option, use it, but if the struct has private fields it won’t work.
The first one won’t work either for private fields.
You can have setters that set private fields, there are also sometimes structs with mixed private and public fields
also adding my vote for the second one