Καθορισμός των τύπων χρησιμοποιώντας μια μεταβλητή

ψήφοι
0

Είμαι χρησιμοποιώντας ένα μοτίβο στο οποίο οι αριθμοί αντιπροσωπεύονται από τους τύπους, όπως αναφέρθηκε σε προηγούμενη ερώτηση . Αυτό λειτουργεί καλά για συνηθισμένη περίπτωση χρήσης μου, αλλά θα ήθελα να είναι σε θέση να εφαρμόσουν κάποιο κώδικα δοκιμής που είναι σε θέση να παράγει τις περιπτώσεις με τον αριθμό τύπου (και γνωρίζετε τον αντίστοιχο αριθμό).

Για ένα σταθερό τύπο που αντιστοιχεί σε ένα σταθερό αριθμό, μπορώ να κάνω κάτι σαν αυτό:

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));
}

Τώρα αυτό που θέλουν να είναι σε θέση να κάνουμε είναι να έχουμε το τελικό get_instance()λειτουργία ρίξτε μια μεταβλητή και να επιστρέψει διαφορετικές περιπτώσεις.

Έτσι εφαρμόσουν κάτι σαν

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

Δεδομένου ότι αυτό είναι καθαρά για λόγους εσωτερικές δοκιμές, είμαι στην ευχάριστη θέση να έχουν χαμηλή αντιπαραθέσεων επίπεδο και μη ασφαλή κωδικό.

Εγώ αρχικά σκέφτηκε να απαριθμήσει όλες τις πιθανές τιμές, αλλά στη συνέχεια, έχω το θέμα των υποκαταστημάτων αγώνα με διαφορετικούς τύπους, που οδηγεί σε γνώρισμα αντικείμενα, και αναρωτήθηκα αν υπάρχει μια λύση πιο τακτοποιημένη.

Δημοσιεύθηκε 09/10/2019 στις 18:53
πηγή χρήστη
Σε άλλες γλώσσες...                            

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