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