< 返回版块

shuqiangzhou 发表于 2021-03-01 20:24

fn get_min_max(t: u8) -> String {
    let string: String = format!(
        "i{t} min:{:?},max:{:?} ;u32 min:{:?},max:{:?}",
        t,
        i(t)::MIN,
        i(t)::MAX,
        u(t)::MIN,
        u(t)::MAX
    );
    string
}

评论区

写评论
johnmave126 2021-03-03 12:15

首先t的取值范围很小,只有8,16,32,64,128,所以完全可以硬编码到一个表里,最后查表 其次,u系列范围永远是0-(1<<t)-1,i系列范围永远是-(1<<(t-1))-(1<<t)-1 所以也可以直接算出来,非得现场编译有点舍本逐末

Easonzero 2021-03-02 13:53
// cargo-deps: concat-idents="1.1.2"

use concat_idents::concat_idents;

macro_rules! min_max {
    ($bit:literal) => {
        format!(
            "i{} min:{:?},max:{:?}; u{} min:{:?},max:{:?};",
            $bit,
            <concat_idents!(ident = i, $bit { ident })>::MIN,
            <concat_idents!(ident = i, $bit { ident })>::MAX,
            $bit,
            <concat_idents!(ident = u, $bit { ident })>::MIN,
            <concat_idents!(ident = u, $bit { ident })>::MAX
        )
    };
}

fn main() {
    println!("{}", min_max!(32));
    // stdout: "i32 min:-2147483648,max:2147483647; u32 min:0,max:4294967295;"
}
madolchepalooza 2021-03-02 11:37

感觉这个是伪需求 姑且认为这个u8代表数据类型的位数,从语言本身角度讲,不加别的东西的话,如果不想硬编码的话就得考虑在运行时算出来; 不过楼主的写法像是在试图从位数转换为对应数据类型,真的有从语言层面支持这种特性的脚本语言吗😂

1 共 3 条评论, 1 页