Я хотел бы принудительно установить примитивный тип, связанный с универсальным типом, чтобы следующий код работал:
struct Wrapper<T> {
value: T,
}
impl<T> Wrapper<T> {
fn method(&self) -> u32 {
self.value as u32
}
}
fn main() {
let wrapper = Wrapper { value: 10 as u16 };
println!("{}", wrapper.method());
}
Эта проблема похожа на Существует ли черта только для примитивных типов, которую яможно использовать в обобщенной функции? за исключением того, что здесь мы можем вывести на основе типов, будет ли преобразование успешным или нет.
Компилятор предлагает использовать черту From
:
error[E0605]: non-primitive cast: `T` as `u32`
--> src/main.rs:7:9
|
7 | self.value as u32
| ^^^^^^^^^^^^^^^^^
|
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
Это будет сводиться к реализации From
для каждого возможного примитивного типа, верно?Есть ли обходной путь для этого?
Я столкнулся с этой проблемой, когда пытался реализовать битовый итератор для примитивных типов:
struct BitIterator<T> {
value: T,
pos: usize,
}
impl<T> BitIterator<T> {
fn new(value: T) -> BitIterator<T> {
//Accept up 32 bit for now
assert!(std::mem::size_of::<T>() <= 4);
BitIterator { value, pos: 0 }
}
}
impl<T> Iterator for BitIterator<T> {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= std::mem::size_of::<T>() * 8 {
return None;
}
let res = Some((self.value as u32 >> self.pos) & 1);
self.pos += 1;
res
}
}