Αλεχ
в расте два указателя на один объект могут быть разного типа
Αλεχ
потому что информация о типе в толстом указателе
Alex
Αλεχ
не важно
Αλεχ
если там структура - статика
Αλεχ
если трейт - динамика
Αλεχ
можешь считать что для Clone + Sized компилятор автоматически генерирует trait CloneSized : Clone + Sized и требует : CloneSized
Alex
Αλεχ
ну вот
Αλεχ
соответственно представь
Αλεχ
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
Alex
Αλεχ
если у B реализация по адресу 100, а у С - 200?
Alex
прости, impl struct for struct?
Αλεχ
я пишу без ШВУ
Sergey
Alex
Αλεχ
ну значит будет динамика, изи
Αλεχ
а если у нас 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
Αλεχ
Αλεχ
чтд :)
Alex
Если что, я не тупой. Точнее, не очень. Ещё точне - тупой, но редко и по ночам.
Sergey
ну, магии нет
интересно, а можно где-нибудь почитать, как динамика работает под капотом?
Alex
Thx!
Sergey
хм
Sergey
да, оно
Alex
А, точно, пойду читать...
Маjко
@kezvision насчет постановки impl Trait в рантайме ты не прав
Маjко
Это компайлтайм, в рантайме только динамика
Cat
понял
Cat
действительно глупость сказал
qthree
Кто нибудь с gcode работает?
Маjко
Sergey
Маjко
Про диспетчеризацию
impl Trait это всегда статическая
если бы сам в теле функции не возвращаешь Box<SomeTrait>, ведь Box<T>: SomeTrait где T: SomeTrait
Sergey
Маjко
Sergey
Маjко
Это через Box и динамику только
Sergey
Бля
Маjко
Тогда какой смысл?
Верни конкретный тип зачейненого итератора и познаешь боль
Верни конкретный тип замыкания и познаешь что невозможное возможно
Sergey
Sergey
Ещё футурки вроде
Маjко
Ага
Sergey
Но там из-за того что компилер анонимный тип генерит
Маjко
А еще конкретный тип итератора или футурки порой вообще нельзя описать потому как там замыкания, которые не имеют конкретного типа в языке
Sergey
Αλεχ
выше были примеры где без impl Trait никуда
Αλεχ
че говорить - полезная штука
Sergey
Маjко
Sergey
Просто выглядит как костыль и сахар одновременно
Маjко
Ну в позиции аргумента это действительно просто сахар
Маjко
В вовзвратной позиции не костыль, костыль был бы если бы сделали такую хуйню только для замыканий, а с итераторами и прочими подобными штуками ебитесь как хотите
А тут генерализовали и сделали универсальную хуйню для возврата того, конкртерый тип чего не имеет значения и новой инфы не несет
Маjко
Щас бы еще допилили до конца existential types чтобы можно было юзать impl Trait в трейтах и ассоциированных типах
Маjко
Это тоже очень нужная хуйня, когда пишешь либы на генериках и даешь юзеру реализовать библиотечный трейт для DI кастомной исплементации
Sergey
Sergey
Sergey
Sergey
Cat
Угу
Cat
Только наверное bar: impl Trait, без &