On Tue, 2025-02-18 at 22:16 +0900, Alexandre Courbot wrote: > > A proper struct with `high` and `low` might be more verbose, but > > it rules out this issue. > > Mmm indeed, so we would have client code looking like: > > let SplitU64 { high, low } = some_u64.into_u32(); > > instead of > > let (high, low) = some_u64.into_u32(); > > which is correct, and > > let (low, high) = some_u64.into_u32(); > > which is incorrect, but is likely to not be caught.
I'm new to Rust, so let me see if I get this right. struct SplitU64 { high: u32, low: u32 } So if you want to extract the upper 32 bits of a u64, you have to do this: let split = some_u64.into_u32s(); let some_u32 = split.high; as opposed to your original design: let (some_u32, _) = some_u64.into_u32s(); Personally, I prefer the latter. The other advantage is that into_u32s and from_u32s are reciprocal: assert_eq!(u64::from_u32s(u64::into_u32s(some_u64)), some_u64); (or something like that)