Festlegen von Typen über eine Variable

stimmen
0

Ich verwende ein Entwurfsmuster , in denen Zahlen von Arten dargestellt werden, wie in einer diskutiert vorherigen Frage . Das funktioniert gut für meine üblichen Anwendungsfall, aber ich möchte in der Lage sein , einige Test - Code zu implementieren , die in der Lage ist Instanzen mit der Nummer-Typ zu erzeugen (und kennen die entsprechenden Nummer).

Für einen festen Typ auf eine feste Zahl entspricht, kann ich etwas tun:

use std::marker::PhantomData;

trait U32Const {
    const VAL: u32;
}

struct U32Const10;
impl U32Const for U32Const10 {
    const VAL: u32 = 10;
}

trait MyTrait {
    fn do_something(&self, val: u32) -> u32;
}

struct MyType<X: U32Const> {
    marker: PhantomData<X>,
}

impl<X: U32Const> MyType<X> {
    fn new() -> MyType<X> {
        MyType::<X> {
            marker: PhantomData,
        }
    }
}

impl<X: U32Const> MyTrait for MyType<X> {
    fn do_something(&self, val: u32) -> u32 {
        val * X::VAL
    }
}

fn get_instance() -> impl MyTrait {
    MyType::<U32Const10>::new()
}

fn main() {
    let a = get_instance();
    println!({}, a.do_something(4));
}

Nun , was ich möchte in der Lage sein zu tun , ist die letzte haben get_instance()Funktion eine Variable nehmen und verschiedene Instanzen zurück.

So implementieren so etwas wie

fn get_instance(val) -> impl MyTrait {
    // ??? returns an instance of MyType::<U32ConstN>::new() where N is set by val
}

Da dies lediglich für interne Testzwecke ist, bin ich glücklich niedriges Niveau Gerangel und unsicheren Code zu haben.

Ich dachte zunächst alle möglichen Werte aufzuzählen, aber dann habe ich die Frage der Übereinstimmung Zweige verschiedene Typen aufweisen, die Objekte zu trait führt, und ich fragte mich, ob es eine sauberere Lösung.

Veröffentlicht am 09/10/2019 um 18:53
quelle vom benutzer
In anderen Sprachen...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more