Я смог установить 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
содержит следующие файлы
Итак, в основном я извлекаю sqlite-amalgamation-3071602.zip
и sqlite-dll-win32-x86-3071602.zip
в C:/distr/sqlite
.
HEADS UP
Вам все равно нужно поместить копию sqlite3.dll
и sqlite3.def
где-нибудь в PATH. IMHO лучше сохранить двоичные файлы sqlite3 в папке bin ruby.
Вы можете хранить значения 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();
});
}