变量前加#啥意思,是在宏里才可以的么

aminic提问

https://github.com/dtolnay/syn/blob/master/examples/lazy-static/lazy-static/src/lib.rs 在此中有很多 #ty #name 这样以#开头的变量,看不懂请教各位大大了。

5 回复
  • lilydjwg

    是那个 quote 宏支持的特殊语法吧。

  • aminic

    呃,看不懂,继续瞎看吧

  • xianghx
        let expanded = quote! {
            extern crate std;
    
            #visibility struct #name;
    
            impl std::ops::Deref for #name {
                type Target = #ty;
    
                fn deref(&self) -> &#ty {
                    #assert_sync
                    #assert_sized
    
                    static ONCE: std::sync::Once = std::sync::ONCE_INIT;
                    static mut VALUE: *mut #ty = 0 as *mut #ty;
    
                    unsafe {
                        ONCE.call_once(|| VALUE = #init_ptr);
                        &*VALUE
                    }
                }
            }
    };
    

    看着就像html 的模板替换:)

  • xianghx
    #visibility struct #name;
    
    pub struct Foo;
    
  • aminic

    @xianghx ,懂了,谢谢,就是模板代码。