Size: a a a

2020 March 25

G

Gymmasssorla in rust_offtopic
Это можно понять, если на минимальном уровне знать алгебру типов
источник

Т8

Т-34 85 in rust_offtopic
Gymmasssorla
Это можно понять, если на минимальном уровне знать алгебру типов
А можно понять по примерам использования, не зная алгебру типов
источник

G

Gymmasssorla in rust_offtopic
Т-34 85
А можно понять по примерам использования, не зная алгебру типов
C++:
enum class MyBadEnum {
   A, B, C, D
}


Rust:
enum MyGoodEnum {
   A, B, C, D
}


enum MyGoodEnumExtended {
   A(i32, i32), B, C(String), D,
}


enum class в C++ = enum в Rust с () у всех вариантов.
источник

G

Gymmasssorla in rust_offtopic
std::variant соответствует enum в Rust, но удобство страдает
источник

Т8

Т-34 85 in rust_offtopic
Gymmasssorla
std::variant соответствует enum в Rust, но удобство страдает
Ты не видишь разницы между union и enum?
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
Ты не видишь разницы между union и enum?
нет
источник

G

Gymmasssorla in rust_offtopic
Не совсем, она есть. Enum в Rust можно воспринимать как disjoint union
источник

G

Gymmasssorla in rust_offtopic
Т-34 85
Ты не видишь разницы между union и enum?
Откуда ты это решил?
источник

G

Gymmasssorla in rust_offtopic
Gymmasssorla
Не совсем, она есть. Enum в Rust можно воспринимать как disjoint union
union не предоставляет никакого способа увидеть активный член в данный момент
источник

AZ

Alex Zhukovsky in rust_offtopic
Gymmasssorla
Не совсем, она есть. Enum в Rust можно воспринимать как disjoint union
ну если знаменитое удобное уб когда пишем флоат читаем инт
источник

G

Gymmasssorla in rust_offtopic
Alex Zhukovsky
ну если знаменитое удобное уб когда пишем флоат читаем инт
Да, это union type punning
источник

G

Gymmasssorla in rust_offtopic
Alex Zhukovsky
ну если знаменитое удобное уб когда пишем флоат читаем инт
Union type punning в Си можно, но там по-моему конкретный случай, где нельзя, т.е. представление объекта может случайно содержать трапа, считывание которого - UB
источник

AK

Alexander Krivitskiy in rust_offtopic
Gymmasssorla
Например class enum в C++ - это частный случай enum в Rust
class enum в C++ это просто тег, перечисление константант. тип суммы - это union, которому нужно ручками присобачить enum, если хочешь вразумительно с ним работать

Вот так enum * (Int + String + Double)
источник

G

Gymmasssorla in rust_offtopic
Alexander Krivitskiy
class enum в C++ это просто тег, перечисление константант. тип суммы - это union, которому нужно ручками присобачить enum, если хочешь вразумительно с ним работать

Вот так enum * (Int + String + Double)
Да, я это знаю. Enum class N вариантов = N
источник

G

Gymmasssorla in rust_offtopic
Собственно зачем нужно было придумывать enum class, std::variant, когда можно было сделать полноценные копродукты, как в Rust
источник

AK

Alexander Krivitskiy in rust_offtopic
Gymmasssorla
Собственно зачем нужно было придумывать enum class, std::variant, когда можно было сделать полноценные копродукты, как в Rust
Из-за обратной совместимости с си, где енам это просто чёртов генератор дефайнов.

Т.е. впадло писать
#define Red 0
#define Green 1
?

Напиши

enum Color = {Red, Green};

Или enum Dir = { Left, Right };
Удобно.

А потом:

Color c = Left;
c == Red

В си даже флагом тайпчек енамов не включить.
источник

AK

Alexander Krivitskiy in rust_offtopic
Gymmasssorla
Собственно зачем нужно было придумывать enum class, std::variant, когда можно было сделать полноценные копродукты, как в Rust
А enum class сделали ради того, чтобы в неймспейс варианты загонять, а не в глобал скоуп выбрасывать
источник

G

Gymmasssorla in rust_offtopic
Alexander Krivitskiy
Из-за обратной совместимости с си, где енам это просто чёртов генератор дефайнов.

Т.е. впадло писать
#define Red 0
#define Green 1
?

Напиши

enum Color = {Red, Green};

Или enum Dir = { Left, Right };
Удобно.

А потом:

Color c = Left;
c == Red

В си даже флагом тайпчек енамов не включить.
Enum оставить. Я говорил про enum class и std::variant
источник

G

Gymmasssorla in rust_offtopic
Gymmasssorla
Enum оставить. Я говорил про enum class и std::variant
Один решает частный случай копродуктов в Rust, второй - решает её неудобно
источник

G

Gymmasssorla in rust_offtopic
Alexander Krivitskiy
Из-за обратной совместимости с си, где енам это просто чёртов генератор дефайнов.

Т.е. впадло писать
#define Red 0
#define Green 1
?

Напиши

enum Color = {Red, Green};

Или enum Dir = { Left, Right };
Удобно.

А потом:

Color c = Left;
c == Red

В си даже флагом тайпчек енамов не включить.
Ну в Си у меня анализ исчерпаемости был
источник