Alex
А для чего, кроме замыканий, оно может пригодиться?
Пробовал возвращать сложные итер-комбо?
պլհկ
ты хочешь чтоб тебе объяснили как это внутри компилятора работает?
Alex
Типа iter chain step filter blah blah
Alex
Ну или завтра придётся побеждать лень. А я очень не хочу и молю.
(((Sergey(not seresha))
Читать исходники может быть долго
(((Sergey(not seresha))
Я уже пытался
պլհկ
ну можешь спросить в оф.канале английском в irc, у нас тут вроде нет спецов по компилятору
(((Sergey(not seresha))
Кодовые базы компиляторов сравнимы с браузерными
պլհկ
популярно в rfc соответствующих все написано
(((Sergey(not seresha))
И это должно быть проще чистых исходников
Cat
я чёт запутался,
(((Sergey(not seresha))
Не я
Alex
Читать исходники может быть долго
Норм. Я обожаю хорошо написанные компиляторы. Вот только я однажды заглянув на годы в них залипаю. Раст читал с целью понять нюансы type inference, - еле выбрался.
(((Sergey(not seresha))
Меня в исходниках больше не компилятор а стандартная библиотека интересовала
(((Sergey(not seresha))
Но решил пока разбираться в либах поменьше
Cat
а что такого в тайп инференс?
он же известен компилятору по сигнатурам функций/значений находящихся в rvalue
Cat
у длинных чейнов он не может вывести тип, как с тем же collect() например
Alex
а что такого в тайп инференс?
Let a = 42.; Автодогадывание Типа скажем так.
Cat
ну окей, для этого у него есть {integer} и {float}, которые он как раз и пытается вывести из контекста
Cat
но всё остальное не умеет выводить из контекста
Cat
короче вывод типов не настолько умён
Cat
борроу чеккер гораздо развесистее
(((Sergey(not seresha))
Инт без точки
(((Sergey(not seresha))
Осталось выбрать нужный флот
Alex
алгоритм вывода типов он смотрел я так понял
Нюансы например типа такого (пишу на тапке по памяти) : 1. fn a()->(u32,i32){...} let foo = [a(), (1. 1)]; 2. fn a()->(u32,i32){...} let foo = [(1. 1), a()]; 3. Fn's rtype is some generic.
Alex
ну окей, для этого у него есть {integer} и {float}, которые он как раз и пытается вывести из контекста
У меня нет по этому вопросу вопросов :)) У меня непонятки были (и частично остались) по impl trait.
Αλεχ
вывод типов намного сложнее
Alex
с джавой работал?
Со всем работал кроме эзотерики.
Cat
Со всем работал кроме эзотерики.
представь, что ты возвращаешь не объект, а только его кусок, отвечающий интерфейсу
Αλεχ
Со всем работал кроме эзотерики.
если ты знаешь что такое анонимные классы то это типа того
Alex
Ебать, простите... Эммм. Жесть.
Cat
Ебать, простите... Эммм. Жесть.
в джаве так направо и налево
Αλεχ
только он еще наследует некоторый интерфейс
Αλεχ
вот и все
Αλεχ
А как это выглядит? Поинтер на структуру с поинтерами?
выглядит так же, как и обычная структура
Αλεχ
fn foo() -> impl Trait превращается в fn foo() -> Agsdhjgasg<>___123
Αλεχ
но это не точно
Αλεχ
структура обычная совершенно
Αλεχ
например когда ты лямбду объявляешь - это ведь структура
Αλεχ
пусть и с именем Agsdhjgasg<>___123
Αλεχ
просто раньше она не могла покидать пределы метода где объявлена
Αλεχ
а теперь может
Αλεχ
короче вывод типов не настолько умён
Ага, офигенно простые правила
Αλεχ
(((Sergey(not seresha))
Хммм
Cat
это теория? просто в теории это естественно по-другому
պլհկ
fn pook() -> impl std::fmt::Display { 5 } ; playground::pook ; Function Attrs: uwtable define internal i32 @_ZN10playground4pook17h48679b7ebd341b3dE() unnamed_addr #0 !dbg !71 { start: ret i32 5, !dbg !75 }
(((Sergey(not seresha))
А функция, которая возвращает эту лямбда, будет всегда возвращать единственный статический экземпляр?
(((Sergey(not seresha))
Или она при компиляции подставится?
Cat
она в рантайме "подставится"
Αλεχ
Αλεχ
в плане читаемости и понятности
Cat
она в рантайме "подставится"
главное, что её тип будет известен (тип или интерфейс, которому она удовлетворяет)
Alex
нет там никаких пойнтеров
Тогда как именно "часть"?
պլհկ
"часть" только для целей тайп чекинга
Αλεχ
Тогда как именно "часть"?
impl Trait позволяет вернуть анонимный (незаписываемый) тип если он реализует трейт
Αλεχ
ну обычные типы тоже можно возвращать, но смысла нет большого
Αλεχ
@notplhk чет ты объясняешь странно, а человек понял. Однако
Cat
да в той же джаве постоянно List l = ArrayList<> ..., где List — интерфейс, а у l нет явного типа
Αλεχ
_ZN10playground4pook17h48679b7ebd341b3dE - это результирующий тип?
Cat
я знаю, что это апкаст
պլհկ
_ZN10playground4pook17h48679b7ebd341b3dE - это результирующий тип?
это имя функции замангленное, результирующий тип - i32
Αλεχ
Это ближе к IAge oj1 = new IAge() { @Override public void getAge() { // printing age System.out.print("Age is "+x); } };
պլհկ
(ну на уровне llvm)
Αλεχ
а, я define internal i32 проглядел