Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何使用quote板条箱发出以非十进制为基数的整数文字?_Rust_Rust Macros_Rust Crates - Fatal编程技术网

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());
    }
}