Vladimir
пусть он при этом будет TraitObject
Loyd
Не знаю, кто там "каждый". Есть определение типа, оно везде одинаковое. Есть несколько определений типажей. И оно не совпадает с типом.
Vladimir
ну вон тебе чуваки скинул пдф
Loyd
Просто разные пространства имён вводят путаницу
Vladimir
с ним спорь
Vladimir
я с тобой спорю по поводу того что Sized не обычный типаж
Vladimir
и всё
Loyd
А что мне с ними спорить? Там написано, что в хаскеле это всё можно рассматривать как инстансы типа высшего порядка
Loyd
Как это делает их равными?
Vladimir
что истоки исходной ошибки именно в обособленности Sized а не в том, что трейты не те
Евгений
Vladimir
истоки в том, что. Трейтобъект не может быть Sized
Vladimir
априори
Евгений
Трейт объект конечно тип, но не совпадающий с самим трейтом
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
Хз, зачем продолжать
Vladimir
Лол)
Vladimir
Я в тебя кодом кинул
Loyd
Не, я точно тебя не понимаю
Loyd
Ты утверждал, что trait = type
Loyd
и просрался
Loyd
Причём тут sized вообще?
Vladimir
Я утверждал что Sized особенный тип
Vladimir
И что Trait юзается в контексте типа в расте
Vladimir
Остальное твои домыслы
Loyd
Ну, только в том смысле, что он по дефолту и выводится компилятором. Тут особенный, да
Loyd
Vladimir
Но ведь юзается
Vladimir
Код то кинул
Loyd
Давай я кину тебе код, где я вызываю foo, а foo у меня u8?
Loyd
Ну, в разных неймспейсах, как ты догадался
Loyd
Ладно, я понял. Ты просто троллишь. На этом и закончим.
Vladimir
Loyd
Зачем?
Ну как зачем. Так же буду кричать, что u8 реализует Fn
Loyd
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.
чёт пропустил это. &Trait будет 16 байт, всегда (ну, если указатель 8)
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
Loyd
Как-то сложно проверяешь. Вон выше я кидал
fn foo<T: Sized>(a: T) {}
fn main() {
use std::fmt::Debug;
let b = &10 as &Debug;
foo(b);
}
Vladimir
Loyd
Выглядит так же, суть разная
Vladimir
fn foo<T: Sized>(a: &T) {}
fn main() {
use std::fmt::Debug;
let b = &10 as &Debug;
foo(b);
}
Vladimir
на ответку
Loyd
Ну да, это ты ссылку на трейт объект даёшь
Евгений
Евгений
Кто будет спорить с тем, что ссылка сайзед?
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
это реализация трейта для трейтобъъекта?
Loyd