generics - 如何将值映射到 Rust 中的类型?
问题描述
我正在编写一个程序,它在命令行上接受数字类型,然后使用该类型调用通用函数。例如,我这样运行程序:
my_programme u32
...在我的代码中,我有:
match cli_type
{
"u32" =>
{
my_generic_function::<u32>(args);
},
"u16" =>
...
如果我想为 8、16、32 和 64 位整数(包括有符号和无符号)执行此操作,则需要大量调用my_generic_function()
. 它看起来很乱,似乎没有必要。
我可以在&str
or String
values 和 type之间定义一个映射T
,或者编写一个函数来返回 type T
,所以我可以写而不是 match 语句:
my_generic_function::<get_type(cli_type)>(args);
解决方案
Rust 在运行时不会保留任何类型信息。标准库中有一个函数std::any::type_name
,它可以给你一个类型的名称,但它只是一个字符串,没有办法回到类型的世界。这一切都发生在编译时,以后不能更改。
但是,您可以使用宏保存一些代码:
macro_rules! make_call_typed {
($($t: ty),*) => {
fn call_typed(input: &str, args: &str) {
match input {
$(
stringify!($t) => {
my_generic_function::<$t>(args);
}
),*
other => panic!("unexpected type: {}", other)
}
}
}
}
当你这样称呼它时:
make_call_typed!(u32, u16, i32, i16);
它将生成如下代码:
fn call_typed(input: &str, args: &str) {
match input {
"u32" => {
my_generic_function::<u32>(args);
}
"u16" => {
my_generic_function::<u16>(args);
}
"i32" => {
my_generic_function::<i32>(args);
}
"i16" => {
my_generic_function::<i16>(args);
}
other => panic!("unexpected type: {}", other),
}
}
推荐阅读
- python-3.x - 亚当优化器和梯度下降
- c - 在vs代码中在哪里添加-g标志进行调试
- javascript - 使用 Subject 和 Observable 有什么区别,各自的用途是什么?
- javascript - 关于使用 React styled-components 对类组件进行样式设置
- php - Magento 迁移后显示旧网站
- javascript - JavaScript 在预定时间倒计时
- ruby-on-rails - 在一类中访问 current_user
- eclipse - Payara ssl 证书和 Eclipse 控制台
- c++ - Visual Studio 2015 中每个新 cpp 文件中的默认代码
- javascript - PHP - how to display user inputs multiform before inserting to database