< 返回版块

套路小迷糊 发表于 2018-01-03 15:10

Tags:新手问题整理

在标准库里面有一个叫做 TypeId 的类型,这个类型需要使用 use std::any::TypeId; 去引入。我们先看一个简单例子

use std::any::TypeId;

fn string() -> TypeId {
    TypeId::of::<String>()
}

fn foo(para_type: TypeId) {
    if TypeId::of::<String>() == para_type {
        println!("参数为类型 String");
    }
}

fn main() {
    foo(string());
}

其实到这里我们基本上就算知道了怎么确定一个变量的类型了。不过把有的人其实特别非要让泛型冒充函数重载。其实并不是特别推荐这么瞎折腾的。不过 Rust 并没有直接把这条路堵死。所以就有了:

use std::any::TypeId;
use std::fmt::Display;

fn foo<T: 'static + Display>(para_type: T) {
    if TypeId::of::<String>() == TypeId::of::<T>() {
        println!("参数为类型 String");
    } else if TypeId::of::<u8>() == TypeId::of::<T>() {
        println!("{}", para_type);
    } else {
        println!("我真没想到您还有这种操作");
    }
}

fn main() {
    foo("一个 String 类型的字符串".to_string());
    foo(0u8);
    foo(-1);
}

反正这种写法,正常人一般不会这样瞎折腾的。

评论区

写评论
作者 套路小迷糊 2018-01-04 16:19

最后说了正常人一般不会这样瞎折腾的

@漂流 这个问题我问过,但是这样的解法巨恐怖

黑腹神喵 2018-01-04 09:36

无聊。。。

漂流 2018-01-03 18:49

这个问题我问过,但是这样的解法巨恐怖

Mike Tang 2018-01-03 15:20

6666。

开眼界了。

1 共 4 条评论, 1 页