#name #type #type-name

tyname

在稳定Rust程序执行期间检索类型名称

1个不稳定版本

0.1.0 2018年11月27日

#368 in 值格式化

MIT/Apache

17KB
353

tyname - 稳定Rust中的类型名称

文档 Crates.io
docs crates

在稳定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() -> () 而不是预期结果。

许可证

在以下许可证中选择一项使用:

由您选择。

双许可:badge badge

贡献

除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,包括在本作品中包含的贡献,都将按照上述方式双许可,不附加任何额外条款或条件。

无运行时依赖