Dyn vs Szablony

0

Zastanawiam się, czy jest jakaś praktyczna różnica w wykorzystaniu polimorfizmu w Rust poprzez trait object albo przez szablon? W teorii jest i znalazłem ciekawą odpowiedź na stacku: link ale jestem ciekaw waszego zdania, który typ preferujecie? Nie mogę się zdecydować, który rodzaj stosować domyślnie w swoich programach :)

fn main() {
    let gandalf = Mage{};
    poly_with_dyn(&gandalf);
    poly_with_templ(&gandalf);
}

trait Magic {
    fn spell(&self);
}

struct Mage {
    
}

impl Magic for Mage {
    fn spell(&self) {
        println!("Fireball");
    }
}

fn poly_with_dyn(mage: &dyn Magic) {
    mage.spell();
}

fn poly_with_templ<T: Magic>(mage: &T) {
    mage.spell();
}
5

Wydaje mi się, że to jedna z sytuacji w stylu jeden rabin powie tak, inny inaczej - ja na ogół wykorzystuję monomorfizację, tj.:

fn poly_with_templ<T: Magic>(mage: &T) {
    mage.spell();
}

fn poly_with_templ(mage: &impl Magic) {
    mage.spell();
}

... ale nie mam co do tego większego uzasadnienia (bo różnice wydajnościowe w 99% nie mają znaczenia), ot takie przyzwyczajenie :-)

Btw, rustowych traitów na ogół nie nazywa się szablonami (ponieważ traity funkcjonują inaczej niż szablony znane z C++), a kwestia dyn vs impl to dynamic dispatch (dyn) vs static dispatch (impl).

2

Najpierw &impl a potem zamiana &dyn, bo w drugą stronę może się nie dać. Kiedy używać &dyn?

2

Dynamic dispatch stosuje gdy:

  • Implementacja zależy od parametrów konfiguracyjnych znanych tylko w czasie działania
  • Nie chcę komplikować typu struktury - zauważ, że jeśli jakaś struktura ma mieć pole typu jakiegoś traitu to jeśli to ma być statycznie, to ten typ staje się częścią typu struktury i struktura musi być generyczna. Nie zawsze chcemy aby użytkownik struktury zawracał sobie głowę typem jakiegoś pola. Dynamic dispatch nie powoduje takiego problemu, bo mogę mieć pole typu np. Box<dyn Foo> ale nie mogę mieć pola nieokreślonego typu impl Foo.

A no i jeszcze taka sprawa, że typ generyczny zawsze można skonkretyzować typem dyn, więc generalnie preferuję wiązania statyczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1