我想编写一个简单的Rust函数,该函数以u64
为模的u8
并返回u8
:
fn bucket(value: u64, number_of_buckets: u8) -> u8 {
value % number_of_buckets
}
但是,由于类型不匹配而无法编译:
error[E0308]: mismatched types
--> src/lib.rs:2:13
|
2 | value % number_of_buckets
| ^^^^^^^^^^^^^^^^^ expected u64, found u8
error[E0308]: mismatched types
--> src/lib.rs:2:5
|
1 | fn bucket(value: u64, number_of_buckets: u8) -> u8 {
| -- expected `u8` because of return type
2 | value % number_of_buckets
| ^^^^^^^^^^^^^^^^^^^^^^^^^ expected u8, found u64
help: you can convert an `u64` to `u8` and panic if the converted value wouldn't fit
|
2 | (value % number_of_buckets).try_into().unwrap()
|
error[E0277]: cannot mod `u64` by `u8`
--> src/lib.rs:2:11
|
2 | value % number_of_buckets
| ^ no implementation for `u64 % u8`
|
= help: the trait `std::ops::Rem<u8>` is not implemented for `u64`
要解决此问题,我必须编写以下非常丑陋的代码:
use std::convert::TryInto;
fn bucket(value: u64, number_of_buckets: u8) -> u8 {
(value % number_of_buckets as u64).try_into().unwrap()
}
没有两次显式的类型转换和两次函数调用,没有更简单的方法吗?我有两个人为这么简单的东西写了那么多代码,这一事实使我怀疑我缺少明显的东西。