Size: a a a

CODE BLOG / Чат

2021 October 12

P

Phantom in CODE BLOG / Чат
Который превращается в Nullable<T> varName = default;
источник

SS

Steel Sword in CODE BLOG / Чат
Интересно...
источник

SS

Steel Sword in CODE BLOG / Чат
А default что значит?
источник

P

Phantom in CODE BLOG / Чат
А я блять сижу и думаю
источник

P

Phantom in CODE BLOG / Чат
Переслано от Phantom
Почему так можно
источник

P

Phantom in CODE BLOG / Чат
Переслано от Phantom
А вот так нет?
источник

P

Phantom in CODE BLOG / Чат
Дефолтное значение для типа
источник

P

Phantom in CODE BLOG / Чат
для классов это null
источник

P

Phantom in CODE BLOG / Чат
для структур, структура с проинициализированными дефолтными значениями полями
источник

P

Phantom in CODE BLOG / Чат
Который как оказалось, тоже сахар
источник

P

Phantom in CODE BLOG / Чат
источник

AE

Andrey Ermak in CODE BLOG / Чат
источник

SS

Steel Sword in CODE BLOG / Чат
Близко, но есть отличия (если мы про раст).
Во-первых, нет неявного каста.
Нужно руками достать значение, явно рассмотреть ситуацию, когда значения нет.

Ты наверное знаешь про деконструкцию структур. В сишарпе она есть
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 сделать...
источник

P

Phantom in CODE BLOG / Чат
Где нет?
источник

P

Phantom in CODE BLOG / Чат
Если что, это я от себя добавил
источник

P

Phantom in CODE BLOG / Чат
И это не неявный каст
источник

P

Phantom in CODE BLOG / Чат
а неявное преобразование
источник

SS

Steel Sword in CODE BLOG / Чат
Это разве не синонимы?
источник

SS

Steel Sword in CODE BLOG / Чат
Или под кастом ты имеешь ввиду только var value1 = (T)value2
?
источник

P

Phantom in CODE BLOG / Чат
А лол, не знал про деконструкцию любых типов по методу, интересно
источник