Rust入门基础:attribute

Anonotaion(常译为注解)

Java中的@Annotation

@Annotation
public void foo() {
    
    
   // Function body
}

java中的Annotation主要用于提供元数据来对代码进行附加描述,它可以在编译、类加载和运行时被读取,场景有:

  1. 编译时检查:Annotation可以在编译时检查程序的代码,比如在编译检查注解@Override、@Deprecated、@SuppressWarnings等;
  2. 生成文档:Annotation可以被javadoc工具读取,并生成对应的文档;
  3. 加载时处理:Annotation可以在class加载时由JVM读取,并执行必要的处理;
  4. 运行时注入:Annotation可以在运行时被读取,我们可以将Annotation当作动态配置,改变运行时的行为;
  5. 最后,Annotation还可以被自定义,使我们能够将Annotation用于自己特定的目的。

Rust中的#[attribute]

区别于Java的Annotation(注解),Rust中叫做attribute(属性),通过Java的场景可以看出,Annotation的作用是相当于注脚,在编译时,或者加载运行时可以获取一些元数据,而Rust的属性更直接的表示为在编译期时注入属性功能代码。

它们可以出现在代码中的任何位置,开发者可以用它来设置类型、函数、子函数等的属性。
比如:
#[derive(Debug)] struct Person { name: String, age: u8 } fn main() { let p = Person { name: "John".to_string(), age: 20}; println!("{:?}", p); }
这段代码中使用了#[derive(Debug)] 的Annotation,其中derive(Debug)为attribute,编译器在编译时会让Person结构体自动实现std::fmt::Debug trait,这样我们就可以使用println!来打印这个Person结构体了。

derive

Rust 的derive关键字可以借助Rust的泛型系统来实现一些自定义的功能,主要有以下几种:

  1. Debug:它允许您将自定义类型转换为std::fmt::Debug,以便使用println!和{:?}打印输出。
  2. Clone:它会创建一个深拷贝,复制包括结构体中嵌套的结构体,实现深拷贝。
  3. Copy:可以将不可变变量中的内容复制到另一个变量中,并在原来变量和新变量之间创建双向联系,当其中一个变量发生变化时,另一个变量也会随之变化。
  4. Default:使用默认参数初始化结构体中的属性,不需要每次依次显式的赋值。
  5. Eq:实现两个结构体的完全相等比较,而不只是使用浅比较。
  6. Ord:实现可比较的排序效果。
  7. Hash:直接用于HashMap的key的赋值。
  8. Serialize/Deserialize:实现json的序列化和反序列化。

自定义attitude

除了derive(),我们可以自定义attitude
可以使用Procedural Macros实现自定义Attribute。该macro位于特定的crate中,可以在调用的时候附加到指定的目标上。具体代码如下:

// #![crate_type = "dylib"]
#![feature(proc_macro)]
#[macro_use]
extern crate quote;
extern crate syn;

#[proc_macro_attribute]
pub fn do_something(_meta: TokenStream, item: TokenStream) -> TokenStream {
    
    
    // 将item token stream转换为ast
    let ast = syn::parse(item).unwrap();

    // 重新组成一个ast
    let something = quote! {
    
    
        #ast
        // 执行一些自定义操作

        // 返回处理过后的ast
        #ast
    };
    // 转换成token stream
    something.into()
}

fn main(){
    
    
    println!("Hello World!");
}

使用自定义Attribute:

#[do_something]
fn test(){
    
    

}

猜你喜欢

转载自blog.csdn.net/BBinChina/article/details/129271685