Vladimir
пусть он при этом будет TraitObject
Loyd
Не знаю, кто там "каждый". Есть определение типа, оно везде одинаковое. Есть несколько определений типажей. И оно не совпадает с типом.
Loyd
но суть в том, что Trait это тип
Не Trait тип, а соответсвующий типаж
Vladimir
ну вон тебе чуваки скинул пдф
Loyd
Просто разные пространства имён вводят путаницу
Vladimir
с ним спорь
Vladimir
я с тобой спорю по поводу того что Sized не обычный типаж
Vladimir
и всё
Loyd
А что мне с ними спорить? Там написано, что в хаскеле это всё можно рассматривать как инстансы типа высшего порядка
Loyd
Как это делает их равными?
Vladimir
что истоки исходной ошибки именно в обособленности Sized а не в том, что трейты не те
Vladimir
истоки в том, что. Трейтобъект не может быть Sized
Vladimir
априори
Евгений
Трейт объект конечно тип, но не совпадающий с самим трейтом
Loyd
истоки в том, что. Трейтобъект не может быть Sized
traitobject так-то sized. Это всегда два указателя
Vladimir
нет
Vladimir
Это указатель на трейтобъект
Евгений
ну вон тебе чуваки скинул пдф
Трейт объект для трейта (X :: * -> Constraint) это (exist a: *. X a => a) или, что тоже самое, это (forall r. (forall a. X a => a -> r) -> r)
Vladimir
ой иди ты нахуй
Vladimir
со своим хаскелем
Евгений
При чём тут хаскель вообще?
Loyd
нет
https://play.rust-lang.org/?gist=01cbd51c7aac97eca5e8eb37f58c4aed&version=undefined ЧЯДНТ?
Vladimir
Создаёшь указатель на трейтобьект?
Loyd
Создаю трейтобъекты
Vladimir
Ясно
Loyd
Лол. То есть ты думаешь, что &Debug это указатель на пару (D, V) ?
Vladimir
Серьезно, что ты пытаешься доказать?
Евгений
Лол. То есть ты думаешь, что &Debug это указатель на пару (D, V) ?
https://doc.rust-lang.org/book/first-edition/trait-objects.html Ну вот тут есть намёк на то, что трейт-объект Debug unsized: Rust does not put things behind a pointer by default, unlike many managed languages, so types can have different sizes. Knowing the size of the value at compile time is important for things like passing it as an argument to a function, moving it about on the stack and allocating (and deallocating) space on the heap to store it. For Foo, we would need to have a value that could be at least either a String (24 bytes) or a u8 (1 byte), as well as any other type for which dependent crates may implement Foo (any number of bytes at all). There’s no way to guarantee that this last point can work if the values are stored without a pointer, because those other types can be arbitrarily large. Putting the value behind a pointer means the size of the value is not relevant when we are tossing a trait object around, only the size of the pointer itself.
Vladimir
Иди вон Sized трейтобьект создай, тогда поговорим
Loyd
Серьезно, что ты пытаешься доказать?
Не знаю. Вроде уже ты просрался с тем, что Trait = Type
Loyd
Хз, зачем продолжать
Vladimir
Лол)
Vladimir
Я в тебя кодом кинул
Loyd
Не, я точно тебя не понимаю
Loyd
Ты утверждал, что trait = type
Loyd
и просрался
Loyd
Причём тут sized вообще?
Vladimir
Я утверждал что Sized особенный тип
Vladimir
И что Trait юзается в контексте типа в расте
Vladimir
Остальное твои домыслы
Loyd
Ну, только в том смысле, что он по дефолту и выводится компилятором. Тут особенный, да
Loyd
И что Trait юзается в контексте типа в расте
Как оказалось, что не юзается
Vladimir
Но ведь юзается
Vladimir
Код то кинул
Loyd
Давай я кину тебе код, где я вызываю foo, а foo у меня u8?
Loyd
Ну, в разных неймспейсах, как ты догадался
Loyd
Ладно, я понял. Ты просто троллишь. На этом и закончим.
Loyd
Зачем?
Ну как зачем. Так же буду кричать, что u8 реализует Fn
Loyd
А, ты не про это
Евгений
https://play.rust-lang.org/?gist=765ae6c2bac889c5c5ea32e222efbed8&version=stable Я как всегда не оч понимаю суть спора, но если я понял правильно, то таки трейт-объекты unsized
Евгений
Compiling playground v0.0.1 (file:///playground) error[E0277]: the trait bound `Shit + 'static: std::marker::Sized` is not satisfied —> src/main.rs:25:6 | 25 | impl Excrement for Shit { | ^^^^^^^^^ `Shit + 'static` does not have a constant size known at compile-time | = help: the trait `std::marker::Sized` is not implemented for `Shit + 'static`
Vladimir
https://play.rust-lang.org/?gist=765ae6c2bac889c5c5ea32e222efbed8&version=stable Я как всегда не оч понимаю суть спора, но если я понял правильно, то таки трейт-объекты unsized
Да, главный мой постулат, что трейт объект ансайзед, и никакой композицией трейтов тот код не заставить работать
Loyd
Как-то сложно проверяешь. Вон выше я кидал fn foo<T: Sized>(a: T) {} fn main() { use std::fmt::Debug; let b = &10 as &Debug; foo(b); }
Vladimir
Ну как зачем. Так же буду кричать, что u8 реализует Fn
Что мешает u8 реализовывать Fn (ну кроме того что он встроенный тип )?
Loyd
Что мешает u8 реализовывать Fn (ну кроме того что он встроенный тип )?
А я не буду реализовывать его явно. Я просто сделаю функцию с тем же именем (и то и другое на self)
Loyd
Выглядит так же, суть разная
Loyd
Ты ссылку пихаешь. Але)
Проверь уже через mem::size_of_val
Vladimir
fn foo<T: Sized>(a: &T) {} fn main() { use std::fmt::Debug; let b = &10 as &Debug; foo(b); }
Vladimir
на ответку
Loyd
Ну да, это ты ссылку на трейт объект даёшь
Евгений
Как-то сложно проверяешь. Вон выше я кидал fn foo<T: Sized>(a: T) {} fn main() { use std::fmt::Debug; let b = &10 as &Debug; foo(b); }
Ну это говорит о том, что ССЫЛКА на трейт-объект sized, это несомненно верно
Евгений
Кто будет спорить с тем, что ссылка сайзед?
Loyd
&Debug это НЕ ссылка на трейт объект
Loyd
это трейт объект
Евгений
Ссылка, я выше кидал кусок книжки про это
big
хм
big
точно ли ссылка?
big
https://doc.rust-lang.org/1.21.0/core/raw/struct.TraitObject.html
Евгений
Там прямо параграф называется "why pointers"
Loyd
Да, про внутренности
Loyd
Почему data и vtable указатели
Loyd
Сам traitobject не по указателю
Vladimir
ты говоришь, что трейтобътект сайзед
Vladimir
и что impl Trait for Trait
Vladimir
это реализация трейта для трейтобъъекта?