Как хранить общие значения в HashMap, содержащейся в неуниверсальной структуре

Я смог установить sqlite3 с ruby2.0.0 на win XP32 со следующей командой:

c:\>gem install sqlite3 --platform=ruby -- --with-sqlite3-dir=C:/distr/sqlite --with-sqlite3-include=C:/distr/sqlite

Папка C:/distr/sqlite содержит следующие файлы

  • shell.c
  • sqlite3.c
  • sqlite3.h
  • sqlite3ext.h
  • sqlite3.def
  • ]
  • sqlite3.dll

Итак, в основном я извлекаю sqlite-amalgamation-3071602.zip и sqlite-dll-win32-x86-3071602.zip в C:/distr/sqlite.

HEADS UP

Вам все равно нужно поместить копию sqlite3.dll и sqlite3.def где-нибудь в PATH. IMHO лучше сохранить двоичные файлы sqlite3 в папке bin ruby.

1
задан hellow 20 March 2019 в 08:30
поделиться

1 ответ

Вы можете хранить значения Cache в HashMap следующим образом:

HashMap<u32,Cache<T>>

Вместо того, чтобы сопоставлять все признаки и понижать объекты признаков, вы можете написать функцию handle() для вашего trait(CacheTrait) и затем реализовать ее. на вашем trait objects(MyU32, MyF64 etc.). Таким образом, у вас будет отдельная реализация для всех остальных объектов черты, и вам не понадобится ссылка с понижением, потому что вам не нужно будет знать, какой это тип, например:

use std::collections::HashMap;

struct AllCaches<T> {
    vectors: HashMap<u32, Cache<T>>,
}

struct Cache<T> {
    inner: T,
}

struct MyU32 {
    inner: u32,
}

struct MyF64 {
    inner: f64,
}

// Do custom logic for u32
impl CacheTrait for MyU32 {
    fn handle(&self) {
        println!("U32");
        let data: Vec<u32> = Vec::new();
    }
}

// Do custom logic for f64
impl CacheTrait for MyF64 {
    fn handle(&self) {
        println!("F64");
        let data: Vec<f64> = Vec::new();
    }
}

trait CacheTrait {
    fn handle(&self);
}

fn main() {
    let mut vectors: HashMap<u32, Cache<Box<dyn CacheTrait>>> = HashMap::new();

    let cache1: Cache<Box<dyn CacheTrait>> = Cache {
        inner: Box::new(MyU32 { inner: 1u32 }),
    };

    let cache2: Cache<Box<dyn CacheTrait>> = Cache {
        inner: Box::new(MyF64 { inner: 2f64 }),
    };

    vectors.insert(1u32, cache1);
    vectors.insert(2u32, cache2);

    let all_caches = AllCaches { vectors };

    all_caches.vectors.iter().for_each(|(_, cache)| {
        cache.inner.handle();
    });
}

Playground [115 ]

0
ответ дан Akiner Alkan 20 March 2019 в 08:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: