13
submitted 3 days ago by [email protected] to c/[email protected]

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 are viewing a single comment's thread
view the rest of the comments
[-] [email protected] 5 points 3 days ago

@[email protected] @[email protected] @[email protected] Thanks for the feedback! Personally I prefer the first option, but based on your comments I will merge the PR with the second option.

[-] [email protected] 12 points 3 days ago

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:

let app = {
  let mut app = ...
  ...
  app
};
[-] [email protected] 1 points 3 days ago

Why not just a let app = app; line after the let mut app = ...; one?

[-] [email protected] 2 points 2 days ago

A 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.

[-] [email protected] 1 points 2 days ago

But a scope adds a nesting level which adds a lot more visual clutter.

[-] [email protected] 2 points 2 days ago

Rebinding with and without mut is a known and encouraged pattern in rust. Leaving things as mut longer than necessary is not.

[-] [email protected] 1 points 3 days ago

Thats even more verbose so the second option is better.

[-] [email protected] 6 points 3 days ago

Yeah if you have the second option, use it, but if the struct has private fields it won't work.

[-] [email protected] 2 points 3 days ago

The first one won't work either for private fields.

[-] [email protected] 2 points 2 days ago

You can have setters that set private fields, there are also sometimes structs with mixed private and public fields

[-] [email protected] 1 points 2 days ago

But why not use a proper builder pattern in that case?

[-] [email protected] 2 points 1 day ago

Because you don't control third party libraries

this post was submitted on 23 Sep 2024
13 points (84.2% liked)

Rust Programming

8038 readers
114 users here now

founded 5 years ago
MODERATORS