When returning an immutable reference to a private struct field. (On mobile and used vertical bars instead of a bunch of HTML codes)

4 points

Note: the ᐸᐳ characters used below are Canadian Aboriginal syllabics because Lemmy devs haven’t fixed broken input sanitization yet.


Well, getters are not an official concept in Rust. You can do whatever works best in your case.

Just worth pointing out that a method with a return value of OptionVecStringᐳᐳ wouldn’t be really a getter, as you must be constructing values, or moving ownership, or cloning. None of these actions conceptually belong to a getter.

Also, you should be clear on the what the Option abstraction means. Does it mean the vector is empty? Does it mean the vector does not exist or some sort of null (FFI ore serialization contexts)? And make sure the code does what you expect it to do.

permalink
report
reply
3 points

Why not &[String]?

permalink
report
reply
3 points

You may be better off with &[String] as a read-only view of Vec. To get &[&str] I think you need to create a new collection to hold the &str values. (String and &str have different memory representations.) But the choice depends on what you want to do - maybe providing &str values adds a convenience that is worth creating a second collection.

For the Option case I would go with Option<&[String]>. My understanding is that Option<&T> is the same size as &T for any T so an owned Option wrapper is zero-cost. If the reference pointer is null then Rust interprets that as None. Besides you usually want ownership of an Option so you can map it or whatever else you want to do.

permalink
report
reply
1 point

Right, I want the convenience of &[&str] , but if it requires creating a second collection then I think &[String] is better. Use cases that require &str can just map to as_str.

permalink
report
parent
reply
2 points

A vec and a string are basically the same thing (a series of bytes)

In the context of vectors I prefer my APIs to return an empty set rather than an None-option. This makes handling it much easier because you can still iterate over it, it just has nothing.

This might involve the compiler making an allocation of an empty array but most of them (gcc, ghc) will now what you are doing and optimize the null check on the empty array to a bool check.

permalink
report
reply
2 points

Vec::new is const and thus can’t allocate anyways.

permalink
report
parent
reply
3 points

Note: the ᐸᐳ characters used below are Canadian Aboriginal syllabics because Lemmy devs haven’t fixed broken input sanitization yet.


A vec and a string are basically the same thing (a series of bytes)

Everything is a series of bytes! I thought you were going to mention that both are fat pointers. But that “series of bytes” description is quite weird.

This makes handling it much easier because you can still iterate over it

This is not a valid consideration/objection, as Options are iterable and you can flatten them:

fn main() {
  let v = vec![1,2,3];
  for n in Some(&v).into_iter().flatten() {
    eprintln!("{n}");
  }
  for n in None::ᐸ&Veci32ᐳᐳ.into_iter().flatten() {
    eprintln!("{n}");
  }
}

This might involve the compiler making an allocation of an empty array but most of them (gcc, ghc) will now what you are doing and optimize the null check on the empty array to a bool check

This paragraph appears to be out of place in the context of a Rust discussion.

permalink
report
parent
reply
1 point
*

Yes, but it’s a pain to iterate over Options of Vec because you need to check/flatten twice. I am aware gcc/ghc is not relevant to rust discussions but I am not sure if rustc performs these specific optimizations. I expect it does because they are trivial. Who knows. I am just some random dude on the internet and a lot of drugs.

permalink
report
parent
reply
2 points

In the context of vectors I prefer my APIs to return an empty set rather than an None-option. This makes handling it much easier because you can still iterate over it, it just has nothing.

I can see that argument. But you can also iterate over an Option-wrapped response with something like for x in xs.into_iter().flatten() { ... }, and the Option gives you an extra bit of information that can be helpful in certain cases.

permalink
report
parent
reply

Rust

!rust@programming.dev

Create post

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

!performance@programming.dev

Credits
  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

Community stats

  • 505

    Monthly active users

  • 890

    Posts

  • 3.9K

    Comments