Близко, но есть отличия (если мы про раст).
Во-первых, нет неявного каста.
Нужно руками достать значение, явно рассмотреть ситуацию, когда значения нет.
Ты наверное знаешь про деконструкцию структур. В сишарпе она есть
https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/functional/deconstructВ расте она тоже есть, и этот синтаксис очень часто используется.
Допустим у тебя кортеж
let my_tuple = (100, 200);
Его можно разбить
let (x, y) = my_tuple;
У тебя может быть
struct Point {
x: f32,
y: f32,
}
И ты можешь написать
let Point { x, y } = get_point();
get_point возвращает Point, let разбивает Point на x и y. Теперь у тебя переменные x и y.
Еще есть структура-кортеж.
struct Point(f32, f32);
let Point(x, y) = get_point();
Тут думаю ничего объяснять не надо.
есть enum.
Можно написать
enum Foo {
A,
B,
C,
}
Только это не числа как в C#, а пустые значения.
Каждый элемент enum может быть структурой.
enum Foo {
A {
field1: String,
},
B(f32, f32),
C {
value: Bar,
},
}
Т.е. enum становится похож на навороченный union из Си.
И есть конструкция match, которая умеет анализировать и деконструировать, как новая версия switch из шарпов.
match get_foo() {
А { field1 } => send_string(field1),
B(x, y) => println!("{}", x * y),
C { value } => drop_bar(value),
}
Еще есть конструкция if let, но о ней мне лень рассказывать.
А теперь следи за руками.
enum Option<T> {
Some(T),
None,
}
...
fn make_foo(value: Option<T>) {
match value {
Some(my_v) => foo(my_v),
None => println!("Fuck off"),
}
}
Смысл именно в том, что
должна быть проверка, Some у нас или не Some, с деконструкцией и извлечением значения из Some и описанием поведения если у нас не Some, а None. Match не даст оставить неразобранные варианты.
Если делать неявный каст, то наверное есть шанс, что null скастуется в T и убъёт программу исключением или ещё чем.
Вот и думай, как это описать сишарпом.
Может, сделать родительский класс Option<T> и подклассы Some со значением и None. И геттер только у Some. Но нужно как-то запретить дальнейшее наследование, я хз, можно ли так в шарпах.
Может, можно что-то в switch сделать...