Rust入门基础:attribute
Posted BBinChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust入门基础:attribute相关的知识,希望对你有一定的参考价值。
Anonotaion(常译为注解)
Java中的@Annotation
@Annotation
public void foo()
// Function body
java中的Annotation主要用于提供元数据来对代码进行附加描述,它可以在编译、类加载和运行时被读取,场景有:
- 编译时检查:Annotation可以在编译时检查程序的代码,比如在编译检查注解@Override、@Deprecated、@SuppressWarnings等;
- 生成文档:Annotation可以被javadoc工具读取,并生成对应的文档;
- 加载时处理:Annotation可以在class加载时由JVM读取,并执行必要的处理;
- 运行时注入:Annotation可以在运行时被读取,我们可以将Annotation当作动态配置,改变运行时的行为;
- 最后,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的泛型系统来实现一些自定义的功能,主要有以下几种:
- Debug:它允许您将自定义类型转换为
std::fmt::Debug
,以便使用println!和:?
打印输出。 - Clone:它会创建一个深拷贝,复制包括结构体中嵌套的结构体,实现深拷贝。
- Copy:可以将不可变变量中的内容复制到另一个变量中,并在原来变量和新变量之间创建双向联系,当其中一个变量发生变化时,另一个变量也会随之变化。
- Default:使用默认参数初始化结构体中的属性,不需要每次依次显式的赋值。
- Eq:实现两个结构体的完全相等比较,而不只是使用浅比较。
- Ord:实现可比较的排序效果。
- Hash:直接用于HashMap的key的赋值。
- 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()
以上是关于Rust入门基础:attribute的主要内容,如果未能解决你的问题,请参考以下文章