Size: a a a

2020 November 06

АМ

Александр Маглеванны... in Rust Beginners
Если не поймет, ты об этом сразу же узнаешь
источник

r

red75prime in Rust Beginners
S. L.
то есть он сам поймет что если я обращаюсь к T::foo(s) то на самом деле я хочу обратиться к S::foo(s), поскольку s это инстанс S и в S описана реализация?
T::foo без S не имеет смысла. Какой-то тип должен реализовывать трейт, чтобы функцию трейта можно было вызвать.
источник

SL

S. L. in Rust Beginners
спасибо, разобрался
источник

a

antuan in Rust Beginners
можно как-то кастануть структуру в трейт?
struct Foo {}

trait T {}

impl T for Foo {}

fn main() {
   let f = Foo{};
   let t = Box::new(f as dyn T);
}
типа того
источник

MB

Mikail Bagishov in Rust Beginners
Box::new(f) as Box<dyn T>
источник

MB

Mikail Bagishov in Rust Beginners
И во многих случаях этот каст произойдет автоматически
источник

a

antuan in Rust Beginners
супер. а если Foo завернут в Arc?
источник

MB

Mikail Bagishov in Rust Beginners
По-моему тоже должно сработать
источник

a

antuan in Rust Beginners
Mikail Bagishov
И во многих случаях этот каст произойдет автоматически
суть: у меня есть несколько структур, реализующих трейт. я их хочу вернуть из функции и у всех них вызвать один и тот же метод.
источник

MB

Mikail Bagishov in Rust Beginners
Ну да, вполне разумный кейс для Box<dyn Trait>
источник

a

antuan in Rust Beginners
vec![Box::new(self.foo.unwrap()) as Box<dyn T<dyn Any>>]
  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `T<(dyn std::any::Any + 'static)>` is not implemented for `std::sync::Arc<Foo>`
источник

/

/bin/cat in Rust Beginners
antuan
суть: у меня есть несколько структур, реализующих трейт. я их хочу вернуть из функции и у всех них вызвать один и тот же метод.
А разве нельзя написать -> impl T в качестве результата?
источник

a

antuan in Rust Beginners
/bin/cat
А разве нельзя написать -> impl T в качестве результата?
можно. но как вернуть желаемое из функции - пока непонятно
источник

a

antuan in Rust Beginners
да, у меня на самом деле не просто trait T{}, а trait T<G>
источник

a

antuan in Rust Beginners
т.е. в итоге, насколько я понял, должно быть так:
pub fn get_(&self) -> Vec<Box<dyn T<dyn Any>>> {
       vec![
           Box::new(self.foo.unwrap()) as Box<dyn T<dyn Any>>,
           Box::new(self.bar.unwrap()) as Box<dyn T<dyn Any>>,
       ]
   }
источник

a

antuan in Rust Beginners
но увы:
the trait `T<(dyn std::any::Any + 'static)>` is not implemented for `std::sync::Arc<Foo>
the trait `T<(dyn std::any::Any + 'static)>` is not implemented for `std::sync::Arc<Bar>
источник

/

/bin/cat in Rust Beginners
antuan
да, у меня на самом деле не просто trait T{}, а trait T<G>
G это дженерик или тип?
источник

a

antuan in Rust Beginners
дженерик
#[async_trait]
pub trait T<G> {
   async fn process(&self, updates: &G) -> Result<usize>;
}
источник

a

antuan in Rust Beginners
источник

a

antuan in Rust Beginners
источник