Αλεχ
в расте два указателя на один объект могут быть разного типа
Αλεχ
потому что информация о типе в толстом указателе
Αλεχ
не важно
Αλεχ
если там структура - статика
Αλεχ
если трейт - динамика
Αλεχ
можешь считать что для Clone + Sized компилятор автоматически генерирует trait CloneSized : Clone + Sized и требует : CloneSized
Αλεχ
ну вот
Αλεχ
соответственно представь
Αλεχ
trait A { fn bar(); } struct B {} struct C {} impl A for B { fn bar() {} } impl A for C { fn bar() {} }
Αλεχ
fn foo(a: &A)
Αλεχ
вопрос
Αλεχ
мы знаем статически
Αλεχ
какой метод будет вызван в Foo
Αλεχ
если у B реализация по адресу 100, а у С - 200?
Sergey
мы знаем статически
не пиши столбиком а то выпишу ридонли
Alex
прости, impl struct for struct?
Αλεχ
я пишу без ШВУ
Sergey
если у B реализация по адресу 100, а у С - 200?
почитай о статической диспетчеризации и динамической
Alex
если у B реализация по адресу 100, а у С - 200?
Это понятно. Да. Не знаем, конечно.
Αλεχ
ну значит будет динамика, изи
Αλεχ
а если у нас fn foo<T: A>(a: &T) то имеем по отдельному методу для каждого Т и знаем адрес статически
Alex
Короче, мои неподтверждённые заключения подтвердились. Везде, где неизвестен size or layout - dynamic dispatch, что логично.
Sergey
https://doc.rust-lang.org/1.0.0-beta/book/static-and-dynamic-dispatch.html
Alex
Да. Круто. Понял. А теперь ещё! Нафига тогда нам Sized и ?Sized ? :)
Αλεχ
чтд :)
Alex
Если что, я не тупой. Точнее, не очень. Ещё точне - тупой, но редко и по ночам.
Sergey
ну, магии нет
интересно, а можно где-нибудь почитать, как динамика работает под капотом?
Alex
Thx!
Cat
интересно, а можно где-нибудь почитать, как динамика работает под капотом?
а по твоей ссылке на книгу внизу там не об этом? — "Representation"
Sergey
хм
Sergey
да, оно
Alex
интересно, а можно где-нибудь почитать, как динамика работает под капотом?
(Догадка) Полагаю, вся инфа (id типа (инт)) в жирном указателе передаётся. От туда и size & mem-layout.
Alex
А, точно, пойду читать...
Маjко
@kezvision насчет постановки impl Trait в рантайме ты не прав
Маjко
Это компайлтайм, в рантайме только динамика
Cat
понял
Cat
действительно глупость сказал
qthree
Кто нибудь с gcode работает?
Sergey
@kezvision насчет постановки impl Trait в рантайме ты не прав
а как работает -> impl Trait? аналогично fn foo(some: &Trait) ?
Маjко
а как работает -> impl Trait? аналогично fn foo(some: &Trait) ?
Ты про позицию в аргументе функции?
Маjко
Про диспетчеризацию
impl Trait это всегда статическая если бы сам в теле функции не возвращаешь Box<SomeTrait>, ведь Box<T>: SomeTrait где T: SomeTrait
Sergey
impl Trait это всегда статическая если бы сам в теле функции не возвращаешь Box<SomeTrait>, ведь Box<T>: SomeTrait где T: SomeTrait
Ну разве нельзя вернуть из функции два разных типа которые реализуют этот трейт?
Sergey
Нет
Тогда какой смысл?
Маjко
Это через Box и динамику только
Sergey
Бля
Маjко
Тогда какой смысл?
Верни конкретный тип зачейненого итератора и познаешь боль Верни конкретный тип замыкания и познаешь что невозможное возможно
Sergey
Ещё футурки вроде
Маjко
Ага
Sergey
Но там из-за того что компилер анонимный тип генерит
Маjко
А еще конкретный тип итератора или футурки порой вообще нельзя описать потому как там замыкания, которые не имеют конкретного типа в языке
Αλεχ
выше были примеры где без impl Trait никуда
Αλεχ
че говорить - полезная штука
Sergey
А еще конкретный тип итератора или футурки порой вообще нельзя описать потому как там замыкания, которые не имеют конкретного типа в языке
результат всегда будет известен в компайлтайме. Но оперировать этим знанием нельзя, как я понял
Sergey
Просто выглядит как костыль и сахар одновременно
Маjко
Ну в позиции аргумента это действительно просто сахар
Sergey
Ну в позиции аргумента это действительно просто сахар
Погоди, impl Trait можно указать в аргументе функции?
Маjко
В вовзвратной позиции не костыль, костыль был бы если бы сделали такую хуйню только для замыканий, а с итераторами и прочими подобными штуками ебитесь как хотите А тут генерализовали и сделали универсальную хуйню для возврата того, конкртерый тип чего не имеет значения и новой инфы не несет
Маjко
Щас бы еще допилили до конца existential types чтобы можно было юзать impl Trait в трейтах и ассоциированных типах
Маjко
Это тоже очень нужная хуйня, когда пишешь либы на генериках и даешь юзеру реализовать библиотечный трейт для DI кастомной исплементации
Cat
Погоди, impl Trait можно указать в аргументе функции?
Да, оно будет как статик диспатч, только нельзя будет использовать turbofish
Маjко
Есть где почитать?
Impl trait tracking issue, там описано
Cat
Угу
Cat
Только наверное bar: impl Trait, без &
Маjко
Черт раст становится не таким простым как раньше ((
Я б сказал что наоборот, в данном случае. Эта фича сильно упрощает жизнь) Но в целом да, порог вхождение снижается, но в общем количество вещей для изучения растет
Sergey
Только наверное bar: impl Trait, без &
Теперь я окончательно перестал понимать разницу с foo(bar: &Trait)