Маjко
^
this
Loyd
Пишу с телефона, несколько сумбурно
Dmitry
> Есть "шаблон" по которому они генерироваться будут
Получается, если данная гипотеза верна, то если убрать шаблон, всё должно заработать? (сча проверю)
Маjко
Хм)
Маjко
Нет
Dmitry
Если убрать шаблонный параметр, например так:
trait Bar {
fn bad(&self, x: &str) where Self: Sized;
}
то всё равно не работает
Loyd
В реализации тоже убрал?
Loyd
Тут object safety не нарушено более
Loyd
А зачем там ограничение на sized?
Nik
Кстати, там про серво речь была
Nik
Как он поживает, какие перспективы?
Kerrigan
мб нельзя примитивы кастовать к трейтам?
Loyd
Loyd
Dmitry
А зачем там ограничение на sized?
Оно было нужно, когда был шаблон (шаблонные параметры по умолчанию Sized). Сейчас его можно убрать, потому что шаблона больше нет. И код будет успешно компилироваться. Но тогда возникает другой вопрос, почему Sized ломает компиляцию в последнем примере?
Маjко
И почему u8 — не Sized?
Fedor
и память течь перестанет, и кастомизация в любую сторону...
Маjко
Течь не перестанет
Маjко
Течь же безопасно
Vladimir
Nik
точнее, движок на серво поменяли
Loyd
Loyd
А кто гарантирует, что в &Bar лежит sized?
Vladimir
Если кратко, дело в том, что когда ты вешаешь self:Sized ты говоришь, что хочешь объекты известного на этапе компиляции размера, а трейт обьекты не такие.
Loyd
Вот если это будет &(Bar + Sized), то будет работать. Правда такой синтаксис не работает пока
Loyd
Маjко
https://play.rust-lang.org/?gist=7128be68288c5e666ff255d41cf37a89&version=stable
Маjко
Да, трейтобжекты реквайрят имплементацию CoerseUnsized
Маjко
И Sized на них навешивать нельзя, если хочется юзать Self
Маjко
Vladimir
Sized в трейтобьектах? Srsly?
Loyd
Loyd
Так, щас
Vladimir
Что значит нет?
Loyd
Значит, не та причина
Loyd
В self всегда данные, которые после for стоят
Loyd
А откуда они, из traitObject->data или из стека/кучи — всё равно
Vladimir
?
Alex
Loyd
А, была статья на эту тему
Loyd
Счаз
Loyd
https://alschwalm.com/blog/static/2017/03/07/exploring-dynamic-dispatch-in-rust/
Loyd
Вот. Там же про multiple bounds и какие решения есть
Loyd
Ну, то есть решения есть, но пасаны в компиляторе не хотят с этим спешить
Маjко
А всё почему? Потому что надо после номикона еще и бложики почитывать, но лень
Loyd
Loyd
Ну, copy/clone это скорее временный хак
Alex
я вообще ничего не читал, да и кроме хеловорлда и не писал :)
Loyd
А решение должно быть фундаментальным, в статье есть вроде
Alex
может к ноябрю дойдут руки
Маjко
Маjко
Vladimir
Loyd
Sized ничем от других маркеров не отличается
Dmitry
Vladimir
Чтобы работал трейтобьект должна быть неявная реализация impl Trait for Trait
Vladimir
Типажа, Trait для типа Trait
Vladimir
Но Trait как тип unsized априори
Loyd
Ты не можешь сделать самостоятельно traitobject, так что рассуждения твои, хоть и верные, но бесполезные
Loyd
В смысле, это на уровне компилятора закладывается и всё
Loyd
Если ты начинаешь как-то хранить маркеры, то Copy или Sized для тебя — всё равно
Vladimir
Да не все равно
Vladimir
Sized особый маркер, у него единственного есть синтаксис ?Sized
Vladimir
Потому что в некоторых контекстах тип должен быть известен на этапе компиляции
Vladimir
А в некоторых может быть и не ищвестен
Loyd
Да это всё понятно. Но для trait object-ов тебе это всё неважно
Loyd
Во время каста ссылки в trait-object компилятор должен в vtable вставить те функции, для которых удовлетворяются ограничения.
Loyd
Причём эти ограничения берёться из trait-object-а, ибо только эти ограничения имеют значения (другие функции тупо вызываться не будут, ибо в trait-object нельзя положить что-то, неудовлетворяющее его ограничениям)
Vladimir
Окей, допустим Sized будет выводится, как мне заставить trait Bla{ fn foo(&self) -> Self} работать в том виде в котором он сейчас работает?
Vladimir
Да и ещё раз говорю, трейт он "безразмерный" как тип
Loyd
Трейта вообще нет как типа
Loyd
Это онли компайлтаймп конструкция