Which code style to initialize structs?
Which code style to initialize structs?
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
You're viewing a single thread.
@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.
5 0 ReplyIf 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:
let app = { let mut app = ... ... app };
12 0 ReplyWhy not just a
let app = app;
line after thelet mut app = ...;
one?1 0 ReplyA scope groups the initialization visually together, while adding the
let app = app;
feels like it just adds clutter - I'd probably just leave it mut in that case.2 0 ReplyRebinding with and without
mut
is a known and encouraged pattern in rust. Leaving things asmut
longer than necessary is not.3 0 ReplyBut a scope adds a nesting level which adds a lot more visual clutter.
1 0 Reply
Thats even more verbose so the second option is better.
1 0 ReplyYeah if you have the second option, use it, but if the struct has private fields it won't work.
6 0 ReplyThe first one won't work either for private fields.
2 0 ReplyYou can have setters that set private fields, there are also sometimes structs with mixed private and public fields
2 0 ReplyBut why not use a proper builder pattern in that case?
1 0 ReplyBecause you don't control third party libraries
2 0 Reply