我正在实现一个类似函数的程序宏,它将单个字符串文字作为参数,但我不知道如何获取字符串文字的值。
如果我打印变量,它会显示一堆字段,其中包括类型和值。他们显然就在那里,在某个地方。我如何获得它们?
extern crate proc_macro;
use proc_macro::{TokenStream,TokenTree};
#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {
let input: Vec<TokenTree> = input.into_iter().collect();
let literal = match &input.get(0) {
Some(TokenTree::Literal(literal)) => literal,
_ => panic!()
};
// can't do anything with "literal"
// println!("{:?}", literal.lit.symbol); says "unknown field"
format!("{:?}", format!("{:?}", literal)).parse().unwrap()
}
Run Code Online (Sandbox Code Playgroud)
#![feature(proc_macro_hygiene)]
extern crate macros;
fn main() {
let value = macros::my_macro!("hahaha");
println!("it is {}", value);
// prints "it is Literal { lit: Lit { kind: Str, symbol: "hahaha", suffix: None }, …Run Code Online (Sandbox Code Playgroud) 在我的 Windows 10 机器上,它是 3.5GG。它存储什么?我怎样才能把它剪下来?
我不知道这个问题的答案会是什么样子,这就是为什么标题如此模糊。
在 Rust 中可以使用“as”将枚举类型转换为数字,如下所示
enum ExampleEnum { A, B, C }
fn main() {
println!("{}", ExampleEnum::B as usize);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个通用函数,可以采用任何可以做到这一点的数据类型?或者封装该功能的一些特征?也许以一种“不安全”的方式(转化?)?
enum ExampleEnum { A, B, C }
fn what_n(x: ???) -> usize {
x as usize
}
fn main() {
println!("{}", what_n(ExampleEnum::B));
}
Run Code Online (Sandbox Code Playgroud)