В
Rust, как и в
Swift, опционалы реализованы через перечисления! Их можно развернуть через оператор
match в
Rust:
fn find_user(name: &str) -> Option<&str> {
if name == "Artem" {
Some("Найден пользователь Artem")
} else {
None
}
}
let user = find_user("Artem");
match user {
Some(message) => println!("{}", message),
None => println!("Пользователь не найден")
}
И через оператор
switch в
Swift:
func findUser(name: String) -> String? {
if name == "Artem" {
"Найден пользователь Artem"
} else {
nil
}
}
let user = findUser(name: "Artem")
switch user {
case .some(let message): print(message)
case .none: print("Пользователь не найден")
}
Есть еще несколько вариантов развертывания опционалов. Например
if let в
Rust:
if let Some(n) = name {
println!("Привет, {}", n);
}
и в
Swift:
if let name {
print("Привет, \(name)")
}
А так же развертывание с дефолтным значением в
Rust:
let greeting = name.unwrap_or("Незнакомец".to_string());
println!("Привет, {}", greeting);
и в
Swift:
let greeting = name ?? "Незнакомец"
print("Привет, \(greeting)")
В
Swift еще есть конструкция
guard let, которой нет в
Rust:
func greetUser(name: String?) {
guard let name else {
print("Имя не указано")
return
}
print("Привет, \(name)")
}
Оба языка используют почти идентичную логику:
Some/
some для значения и
None/
nil при его отсутствии. Это очень удобно, не придется привыкать к совершенно новой концепции при переходе между языками.