1个不稳定版本
0.1.0 | 2018年11月27日 |
---|
#368 in 值格式化
17KB
353 行
tyname - 稳定Rust中的类型名称
文档 | Crates.io |
---|---|
在稳定Rust上运行
在稳定Rust程序执行期间检索类型名称。
其他Rust生态系统中的解决方案使用不稳定的core::intrinsics::type_name
API。
示例
使用
适用于每个内置类型。
assert_eq!(type_name::<()>(), String::from("()"));
assert_eq!(type_name::<i32>(), String::from("i32"));
assert_eq!(type_name::<[u8; 32]>(), String::from("[u8; 32]"));
适用于最多10个不同字段的元组。
assert_eq!(
type_name::<(i8, i16, i32, i64, i128)>(),
String::from("(i8, i16, i32, i64, i128)")
);
适用于结构体。
assert_eq!(
type_name::<Vec<u8>>(), String::from("Vec<u8>")
);
assert_eq!(
type_name::<Result<i32, String>>(),
String::from("Result<i32, String>")
);
适用于函数指针类型。
assert_eq!(
type_name::<fn(i32, f32) -> bool>(),
String::from("fn(i32, f32) -> bool")
);
assert_eq!(
type_name::<fn()>(),
String::from("fn() -> ()")
);
实现
使用TypeName
trait来检索名称。任何实现了它的类型都可以使用。这个库已经为用户实现了最常见的类型
用户也可以为其自己的类型手动实现它。
注意:计划实现 derive 功能,但尚未完成。
/// The type we want to make work for the `TypeName` trait
struct Foo<T1, T2> { a: T1, b: T2 }
/// The manual implementation.
impl<T1, T2> crate::TypeName for Foo<T1, T2>
where
T1: TypeName,
T2: TypeName,
{
fn write_type_name<W>(w: &mut W) -> std::fmt::Result
where
W: std::fmt::Write
{
w.write_str("Foo<")?;
T1::write_type_name(w)?;
w.write_str(", ")?;
T2::write_type_name(w)?;
w.write_char('>')
}
}
fn main() {
assert_eq!(
type_name::<Foo<bool, char>>(),
String::from("Foo<bool, char>")
);
}
未来
使用#[derive(TypeName)]
功能,这将使自定义类型(如上面的struct Foo
)能够像以下这样实现。
#[derive(TypeName)]
struct Foo<T1, T2>{
a: T1,
b: T2,
}
完成。
不足之处
- 尚未提供
#[derive(TypeName)]
功能。 - 与
core::intrinsics::type_name
API相比,需要在运行时进行计算 - 无法打印出类型的路径,例如在
std::result::
中的std::result::Result<T, E>
。 - 目前存在返回单元类型的功能指针类型的问题,例如
fn()
将会打印fn() -> ()
而不是预期结果。
许可证
在以下许可证中选择一项使用:
- Apache许可证,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
双许可:
贡献
除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,包括在本作品中包含的贡献,都将按照上述方式双许可,不附加任何额外条款或条件。