Size: a a a

2020 February 02

p

polunin.ai in rust_offtopic
Alex Zhukovsky
вопрос только в именовании варианта, ничего ломаться не будет
То есть код с обобщением превратиться в
enum Foo<T> {
 A,
 T(T)
}
?
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
fn foo<T>(x: A) -> T | A {}
Не надо
fn foo<T>(x: A) -> A | B {}
Надо
для
fn foo<T>(x: A) -> T | A {}

должно сгенерироваться

fn foo<T>(x: A) -> SomeUniqueEnum {}

enum SomeUniqueEnum<T> { T(T), A(A)
}

что тут сломается?
источник

p

polunin.ai in rust_offtopic
Ну тогда не вижу применения этому варианту
источник

p

polunin.ai in rust_offtopic
Alex Zhukovsky
ты костыль предлагаешь. Фичи должны друг с другом жить, а "тут играем тут нет" оставь плюсам
Нельзя сделать генерик генерика
источник

AZ

Alex Zhukovsky in rust_offtopic
вопрос в то, имеет ли смысл запись A | A
источник

G

Gymmasssorla in rust_offtopic
Это уже предлагалось неоднократно. Всегда возникает два принципиальных вопроса (помимо синтаксиса, разумеется):
1) как матчиться по значению такого типа;
2) что делать, если у тебя обобщённый тип T | U и они при мономорфизации совпадают
источник

AZ

Alex Zhukovsky in rust_offtopic
Gymmasssorla
Это уже предлагалось неоднократно. Всегда возникает два принципиальных вопроса (помимо синтаксиса, разумеется):
1) как матчиться по значению такого типа;
2) что делать, если у тебя обобщённый тип T | U и они при мономорфизации совпадают
не вижу проблем
источник

AZ

Alex Zhukovsky in rust_offtopic
1. матчишься по конструктору который совпадает с имеем типа
2. таскаешь тег чтобы различать варианты
источник

AZ

Alex Zhukovsky in rust_offtopic
хотя кому-то будет логично, что i32 | i32 == i32
источник

В

Вафель in rust_offtopic
Alex Zhukovsky
так весь смысл этой затеи в том чтобы тебе не надо было энум делать
Ну это не значит что это для того чтобы тебе никогда енамы не приходилось использовать.

Точно так-же как туплы не полная замена структурам.

Для создания c-like енумов сокращённым синтаксисом, пришлось бы добавлять что-то вроде тэгов (не помню где точно, но врде в closure такое видел)



Альтернативно можно усложнить синтаксис, чтобы с матчем чисел не конфликтовало. Но я не думаю что неименованные c-like енамы это так полезно.
источник

G

Gymmasssorla in rust_offtopic
Alex Zhukovsky
1. матчишься по конструктору который совпадает с имеем типа
2. таскаешь тег чтобы различать варианты
1) А если два варианта с одним и тем же типом?
источник

AZ

Alex Zhukovsky in rust_offtopic
Gymmasssorla
1) А если два варианта с одним и тем же типом?
конструкторы все равно будут разные, T/U в твоем примере
источник

p

polunin.ai in rust_offtopic
Gymmasssorla
Это уже предлагалось неоднократно. Всегда возникает два принципиальных вопроса (помимо синтаксиса, разумеется):
1) как матчиться по значению такого типа;
2) что делать, если у тебя обобщённый тип T | U и они при мономорфизации совпадают
2 ошибка компиляции
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
2 ошибка компиляции
у тебя потом говно будет и никто этой фичей не будет пользоваться
источник

AZ

Alex Zhukovsky in rust_offtopic
потому что затащил серде в актикс, и там что-то в генериках поломалось
источник

G

Gymmasssorla in rust_offtopic
Alex Zhukovsky
конструкторы все равно будут разные, T/U в твоем примере
То есть имена конструкторов обязательно писать?
источник

AZ

Alex Zhukovsky in rust_offtopic
удобно
источник

AZ

Alex Zhukovsky in rust_offtopic
Gymmasssorla
То есть имена конструкторов обязательно писать?
нет, они генерироваться будут
источник

AZ

Alex Zhukovsky in rust_offtopic
foo<T, U>() -> T | U
источник

В

Вафель in rust_offtopic
Alex Zhukovsky
вопрос в то, имеет ли смысл запись A | A
Да, ибо в дженериках иначе будет разное поведение при разных дженериках и

fn foo<A, B>(ab: A | B) {
   match ab {
       0(A) => ...,
       1(B) => ...,
   }
}


Будет везти себя по разному в зависимости от того, A == B, или нет
источник