Я пытаюсь реализовать библиотеку бит-вектора в качестве упражнения, однако у меня возникают проблемы, когда вы хотите определить значение по умолчанию для параметра общего типа.Default generic type parameter не может быть выведено
Это отрывок кода у меня есть:
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 }
}
//...
}
И я хочу использовать его следующим образом:
let vec = BitVector::with_capacity(1024);
Однако я получаю ошибку компиляции:
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
Чтобы дать немного больше контекста коду, действующие в настоящий момент типы для BitStorage
включают (но не ограничиваются *) u8
, u16
, u32
, u64
и usize
.
(*) Я думаю, что вы можете написать обычную реализацию u128
(как пример), если вы реализуете все черты для этого типа.
После поиска по проблеме я нашел RFC 213, который, похоже, не be stable yet. Однако, с другой стороны, HashMap в настоящее время стабильный использует значения по умолчанию, поэтому он должен работать, правильно?