Size: a a a

Rust — русскоговорящее сообществo

2020 September 10

OA

Oleg Andreev in Rust — русскоговорящее сообществo
а просто x.downcast_ref() не компилится потому что он видит Box<dyn MyTrait> и что там внутри Any он уже не видит
источник

AK

Adam K in Rust — русскоговорящее сообществo
Oleg Andreev
а просто x.downcast_ref() не компилится потому что он видит Box<dyn MyTrait> и что там внутри Any он уже не видит
fn as_any(&self) -> &dyn Any { self } попробуй в свой трейт добавить и его заюзать.
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
конфликт на Sized
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
|
8 |     fn as_any(&self) -> &dyn Any { self }
 |                                    ^^^^ doesn't have a size known at compile-time
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
а если добавить +Sized, то нельзя trait object сделать
источник

AK

Adam K in Rust — русскоговорящее сообществo
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
!!
источник

AK

Adam K in Rust — русскоговорящее сообществo
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
какая-то мутная ебанина вместо нормального изкоробочного решения
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
ну да ладно. Спасибо!
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
я так понимаю, что когда нам нужно вернуть &dyn Any, там создается какой-то смарт-референс, где есть ссылка на табличку про тип объекта?
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
источник

AK

Adam K in Rust — русскоговорящее сообществo
Oleg Andreev
я так понимаю, что когда нам нужно вернуть &dyn Any, там создается какой-то смарт-референс, где есть ссылка на табличку про тип объекта?
Ну &dyn Trait у тебя всегда "смарт-референс", да
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
ага
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
и для каждого типа который решил impl fn to_any() компилятором будет создана табличка с имплами для даункаста и type_id
источник

Э

Эрик in Rust — русскоговорящее сообществo
Oleg Andreev
trait MyTrait: Any + Debug {
   fn foo(&self) -> String {
       "MyTrait::foo()".to_string()
   }
}

impl MyTrait for String {}

fn main() {
   let x: Box<dyn MyTrait> = Box::new("Hi".to_string());
   println!("&x: {:?}", &x);
   println!("&x.foo(): {:?}", &x.foo());
   println!("&x as Any->String: {:?}", (&x as &dyn Any).downcast_ref::<String>());
}


вот тут все равно None в конце
let x: Box<dyn (Mytrait + Any)> пробовал?
источник

AK

Adam K in Rust — русскоговорящее сообществo
Эрик
let x: Box<dyn (Mytrait + Any)> пробовал?
Плюсик только на Send и Sync работает
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ай, да. И на лайфтайм.
источник

JG

JeisonWi Garrison in Rust — русскоговорящее сообществo
источник

Constantine ʕ◔ϖ◔ʔ🦀... in Rust — русскоговорящее сообществo
источник