Rust 如何使用quote板条箱发出以非十进制为基数的整数文字?
我使用生成代码来解码汇编操作。我的芯片使用说明手册使用二进制值来描述操作,因此我希望生成的代码也将文字表示为二进制值,以便于我抽查正确性 我找不到具体的方法。提供了许多控制文本后缀的方法(Rust 如何使用quote板条箱发出以非十进制为基数的整数文字?,rust,rust-macros,rust-crates,Rust,Rust Macros,Rust Crates,我使用生成代码来解码汇编操作。我的芯片使用说明手册使用二进制值来描述操作,因此我希望生成的代码也将文字表示为二进制值,以便于我抽查正确性 我找不到具体的方法。提供了许多控制文本后缀的方法(u8,i32,等等),但我看不到任何控制文本基础的方法 我的理想格式是以2为底,每四位使用一个下划线,并以适当的后缀结尾,但只需要以2为底 使用quote::quote;//1.0.6 fn main(){ 设值=0b0101_0101_u8; 让code=format!(“{}”,引号!{#value});
u8
,i32
,等等),但我看不到任何控制文本基础的方法
我的理想格式是以2为底,每四位使用一个下划线,并以适当的后缀结尾,但只需要以2为底
使用quote::quote;//1.0.6
fn main(){
设值=0b0101_0101_u8;
让code=format!(“{}”,引号!{#value});
断言(代码)(0b0101\U 0101\U u8);
}
线程“main”在“断言失败:`(左==右)时惊慌失措`
左:`“0b0101\U 0101\U u8”`,
右:`“85u8”`,src/main.rs:8:5
您可以使用格式将数字格式化为字符串
然后从中构造一个TokenStream
,然后可以在quote中使用它代码>:
use proc_macro2::TokenStream;
use quote::quote; // 1.0.6
use std::str::FromStr;
fn main() {
let value = 0b0101_0101_u8;
let value_formatted = TokenStream::from_str(&format!("0b{:08b}_u8", value)).unwrap();
let code = format!(
"{}",
quote! {
#value_formatted
}
);
assert_eq!("0b01010101_u8", code);
}
格式
宏不支持下划线,但可以通过自定义格式化程序轻松扩展以插入下划线。这是我使用下划线建议的实现制作的包装类型:
use proc_macro2::TokenStream;//1.0.17
使用quote::ToTokens;//1.0.6
使用std::str::FromStr;
结构asbit(T);
为AsBits执行ToTokens{
fn to_令牌(&self,令牌:&mut-TokenStream){
让b=格式(
“0b{:04b}{:04b}{uuuu8”,
(self.0和0xF0)>>4,
(self.0和0x0F)>>0,
);
extend(TokenStream::from_str(&b).unwrap());
}
}
格式!(“0b{:04b}{:04b}{uuuu8”,值>>4,值&0x0F)
对u8
执行此操作。将其置于双向
的后面似乎是最简单的方法。
use quote::quote; // 1.0.6
fn main() {
let value = AsBits(0b0101_0101_u8);
let code = format!("{}", quote! { #value });
assert_eq!("0b0101_0101_u8", code);
}
use proc_macro2::TokenStream; // 1.0.17
use quote::ToTokens; // 1.0.6
use std::str::FromStr;
struct AsBits<T>(T);
impl ToTokens for AsBits<u8> {
fn to_tokens(&self, tokens: &mut TokenStream) {
let b = format!(
"0b{:04b}_{:04b}_u8",
(self.0 & 0xF0) >> 4,
(self.0 & 0x0F) >> 0,
);
tokens.extend(TokenStream::from_str(&b).unwrap());
}
}