I have a very simple struct called 'User' over which I am iterating in a for-loop looking for a specific user.
The function returns a Option, as it is possible that no user will be found.
The problem I'm having is that I'm getting a compilation failure: expected (), found enum std::option::Option
Code is the following:
pub struct User {
pub id: u8,
pub name: String
}
fn get_name_by_id(id: u8, users: &Arc<Mutex<Vec<User>>>) -> Option<String> {
let user_vec = users.lock().unwrap();
for user in user_vec.iter() {
if user.id == id {
Some(String::from(user.name.as_str()))
}
}
None
}
Is there an elegant way to solve this problem?
PS: This is my first post here, I hope the code will be formatted correctly!
There is find method on Iterator designed to do exactly this. If you want to write the same code by hand without iterator adapter, you can check the source.
You're welcome! In fact, Iterator API is rather rich, as you can see by the docs, so in many cases you may be able to do what you need without for loops at all. And if you really need it, well, return keyword is always here (but in the current case the iterator method would be clearly more idiomatic).
While it's not exactly relevant to your question, you may want to replace String::from(user.name.as_str()) with user.name.clone(). As well as being less keystrokes, it makes it more obvious that you're returning a copy of the user's name and not doing anything special.
Just so you get an answer to your actual question, all you need to do is use the return statement in your for loop, like return Some(user.name.clone());.
Thank you for your answers, I'm (probably obviously) just starting to learn Rust. @Michael-F-Bryan Thanks! I somehow thought only types with the Copy-Trait have clone() available. @radix Good to know, one day I might find myself in a more complex situation, where this will come in handy.