由于 u8 是 not PartialEq<usize>,usize 是 not PartialEq<u8>,并且 Rust 在设计上没有原始类型之间的隐式转换,因此您需要将两个元组转换为相同类型以使它们成为PartialEq。
显式转换
根据 user4815162342
的建议
usize 不能小于u8,所以显式强制转换是安全的
u8 -> usize
(x.0 as usize, x.1 as usize) == y
但强制 usize -> u8 会静默截断。下面的 sn-p 将编译并声明 x 等于 y。
let x: (u8, u8) = (255, 255);
let y: (usize, usize) = (1000, 1000);
if (y.0 as u8, y.0 as u8) == x {
println!("x and y are equal");
} else {
println!("x and y are not equal");
}
From特征转换
您也可以将u8 -> usize 与from 进行转换,因为usize 是From<u8>
(usize::from(x.0), usize::from(x.1)) == y
请注意,usize -> u8 和 from 无法编译,因为 u8 不是 From<usize>。
(u8::from(y.0), u8::from(y.1)) == x
这就是为什么它被认为是一种安全的转换方法。 Clippy 可以使用规则cast_lossless rule 检测可能进行此类转换的位置
Try_From特征转换
您还可以使用Try_From trait 进行从usize 到u8 的可失败转换。
match (u8::try_from(y.0), u8::try_from(y.1)) {
(Ok(y_0), Ok(y_1)) => {
if (y_0, y_1) == x {
println!("x and y are equal");
} else {
println!("x and y are not equal");
}
},
_ => panic!("Conversion from x type to y type failed")
}
如果usize 值大于u8::Max,则转换将导致Error。这也算是一种安全的转换方式。