Sto provando a implementare una libreria Bit Vector come esercizio, tuttavia sto riscontrando problemi quando si desidera definire un valore predefinito per un parametro di tipo generico.Il parametro di tipo generico predefinito non può essere dedotto
Questo è un estratto del codice che ho:
extern crate num;
use std::cmp::Eq;
use std::ops::{BitAnd,BitOrAssign,Index,Shl};
use num::{One,Zero,Unsigned,NumCast};
pub trait BitStorage: Sized +
BitAnd<Self, Output = Self> +
BitOrAssign<Self> +
Shl<Self, Output = Self> +
Eq + Zero + One + Unsigned + NumCast + Copy {}
impl<S> BitStorage for S where S: Sized +
BitAnd<S, Output = S> +
BitOrAssign<S> +
Shl<S, Output = S> +
Eq + Zero + One + Unsigned + NumCast + Copy {}
pub struct BitVector<S: BitStorage = usize> {
data: Vec<S>,
capacity: usize
}
impl<S: BitStorage> BitVector<S> {
pub fn with_capacity(capacity: usize) -> BitVector<S> {
let len = (capacity/(std::mem::size_of::<S>() * 8)) + 1;
BitVector { data: vec![S::zero(); len], capacity: capacity }
}
//...
}
E voglio usarlo come segue:
let vec = BitVector::with_capacity(1024);
Tuttavia ottengo un errore di compilazione:
lib.rs:225:24: 225:48 error: unable to infer enough type information about
_
; type annotations or generic parameter binding required [E0282]
lib.rs:225 let vec_1000 = BitVector::with_capacity(1000);
^~~~~~~~~~~~~~~~~~~~~~~~
lib.rs:225:24: 225:48 help: runrustc --explain E0282
to see a detailed explanation
Per dare un po 'più di contesto al codice, i tipi attualmente validi per BitStorage
includono (ma non sono limitati a *) u8
, u16
, u32
, u64
e usize
.
(*) Penso che si possa scrivere un'implementazione personalizzata u128
(come l'esempio) se si implementano tutti i tratti di quel tipo.
Dopo aver cercato su Google il problema, ho trovato RFC 213 che non sembra essere be stable yet. Tuttavia, d'altra parte HashMap attualmente su stabile utilizza valori predefiniti, quindi dovrebbe funzionare, giusto?