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.