#字面量 #表达式 # #原始类型 #获取 #组合

typeof-literal

一个宏,用于返回任何字面量表达式或字面量组合的类型

1个稳定版本

1.0.0 2023年9月14日

#1503Proc宏

MPL-2.0 许可证

10KB
125

typeof-literal

一个宏,用于获取任何字面量或原始表达式的类型


lib.rs:

typeof_literal 是一个宏,可以获取任何字面量或字面量组合表达式的类型。它可以用来帮助实现由宏生成的特质或函数定义,其中宏可以访问某些字面量值,但仍需要在函数返回值或特质关联类型中命名类型。

示例

use typeof_literal::typeof_literal;

/// This macro creates a `const fn` called `$name` that returns `$value`.
macro_rules! maker {
($name:ident => $value:expr) => {
const fn $name() -> typeof_literal!{$value} {
$value
}
}
}

maker! {ten => 10i16}
let value: i16 = ten();
assert_eq!(value, 10);

maker! {hello_world => "Hello, World"}
assert_eq!(hello_world(), "Hello, World");

// It works on composite types
maker! {tuple => (123, [0u8; 2], [1i64, 2, 3, 4], "Hello")};
assert_eq!(tuple(), (123i32, [0, 0], [1, 2, 3, 4], "Hello"));

// It also works on common macro literal-ish expressions
maker! {concatenated => concat!(1, 2, 3, "abc")}
assert_eq!(concatenated(), "123abc");

// We support blocks and other nested expressions, and can use `as` to support
// *any* arbitrary expression
maker! {computed => {
let x = 1;
let y = 2;
(x + y) as i32
}}
assert_eq!(computed(), 3);

在这些示例中,使用了 maker 宏来创建返回字面量值的函数。typeof_literal 允许我们自动知道该字面量的类型,因此我们可以将其用作函数的返回类型,而不是强制调用者包含它,例如:maker!(int => 123 as i64)

目前它只适用于原始字面量和字面量组合。未来我们可能会添加对简单二元操作(如 1 + 2)、结构字面量等的支持。

依赖项

~260–700KB
~17K SLoC