gpt4 book ai didi

rust - 如何实现Into trait而不使用 `as usize`将所有输入转换为usize?

转载 作者:行者123 更新时间:2023-12-03 11:43:10 25 4
gpt4 key购买 nike

我有一个基于usize输入返回compound duration的函数:

pub fn format_dhms(seconds: usize) -> String 

如果输入是 6000000:
println!("{}", format_dhms(6000000));

它返回:

69d10h40m

当输入为数字时,此方法有效,但是当我使用具有固定类型的另一个函数的输出时,则需要使用 as usize。例如,如果我使用 Durationas_secs() = u64方法使用 as_nanos() = u128 的输出。

当有人传递 u128::MAX时,我想像 usize一样通过将输入截断为最大接受值来处理它。

这是我正在尝试的:( https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4a8bfa152febee9abb52d8244a5092c5)

#![allow(unused)]
use std::time::Instant;

fn format<T: Into<usize>>(number: T) {
if number == 0 {
//println!("{}", number)
} else {
//println!("{}> 0", number)
}
}

fn main() {
let now = Instant::now();
format(now.elapsed().as_nanos()); // u128
format(now.elapsed().as_secs()); // u64
}

但是我得到的一些错误是:

error[E0277]: the trait bound `usize: std::convert::From<i32>` is not satisfied
the trait `std::convert::From<i32>` is not implemented for `usize`
...
error[E0369]: binary operation `==` cannot be applied to type `T`

如果我删除 <T: Into<size>>可以使用,但是我需要使用 as usize
 format(now.elapsed().as_nanos() as usize);

有什么方法可以转换输入以防止使用 as usize,或者当输入只是没有定义类型的数字时如何实现相同的行为?

最佳答案

您可以使用std::mem::size_of来检查输入类型是否适合usize,并在不适合时使用位操作来截断:

use std::convert::{ TryFrom, TryInto };
use std::fmt::Debug;
use std::ops::BitAnd;
use std::time::Instant;

fn format<T: TryInto<usize> + TryFrom<usize> + BitAnd<Output=T>> (number: T)
where <T as TryFrom<usize>>::Error: Debug,
<T as TryInto<usize>>::Error: Debug
{
let number: usize = if std::mem::size_of::<T>() <= std::mem::size_of::<usize>() {
number.try_into().unwrap()
} else {
(number & usize::MAX.try_into().unwrap()).try_into().unwrap()
};
if number == 0 {
//println!("{}", number)
} else {
//println!("{}> 0", number)
}
}

Playground

请注意,只要您仅使用无符号类型,由于对类型大小的检查可确保转换始终有效,因此 unwrap绝不会失败。

关于rust - 如何实现Into trait而不使用 `as usize`将所有输入转换为usize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61898602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com