В моей попытке изучить ржавчину я начинаю с некоторых базовых упражнений. Я написал простую функцию, которая, как я надеюсь, является идиоматической ржавчиной для подсчета количества установленных бит в целом числе.
fn bit_count(x: u32) -> u32 {
(0..32).into_iter().map(|i| (x >> i) & 1).sum()
}
fn main() {
println!("{} has {} set bits.", 5, bit_count(5));
}
Теперь я хочу сделать функцию универсальной, чтобы я мог передавать любой целочисленный тип:i32
, u32
, i64
, u64
... и т. Д.
Я довольно хорошо знаком с tmp в c ++, но моя попытка с дженериками ржавчины провалилась, поэтому у меня есть следующее:
extern crate num;
fn bit_count<T>(x: T) -> T
where
T: num::Integer + std::ops::BitAnd + std::ops::Shr + num::NumCast,
std::ops::Range<T>: std::iter::IntoIterator,
{
(T::zero()..num::NumCast::from(32).unwrap())
.into_iter()
.map(|i| (x >> num::NumCast::from(i)) & T::one())
.sum()
}
fn main() {
println!("{} has {} set bits.", 5, bit_count(5));
}
Я увидел объявленный num
ящик, и он показался мне подходящим. Я ожидал, что у меня будет T: num::Integer
, и все будет готово, однако я чувствую, что здесь скручиваю кроличью нору, и я не могу получить правильную комбинацию границ.
Любые предложения были бы хорошими! и любые советы, которые сделают мой код более идиоматическим, также будут полезны, спасибо.