在 Rust 中,属性宏和自定义派生宏用于在编译时处理代码,通常为结构体添加功能或修改其定义。本文将解析这些宏的工作原理,并介绍与结构体相关的 impl 和 trait。
在 Rust 中,属性宏和自定义派生宏用于在编译时处理代码,通常为结构体添加功能或修改其定义。本文将解析这些宏的工作原理,并介绍与结构体相关的 impl 和 trait。
以下是一个简单的 Person 结构体:
struct Person {
    name: String,
    age: u8,
}在 Rust 中,通过 impl 为结构体定义关联函数和方法。例如:
struct Person {
    age: u8,
    name: String,
}
impl Person {
    // 创建新的 Person 实例
    fn new(name: String, age: u8) -> Self {
        Person { name, age }
    }
    // 判断是否达到饮酒年龄
    fn can_drink(&self) -> bool {
        self.age >= 21
    }
    // 返回一年后的年龄
    fn age_in_one_year(&self) -> u8 {
        self.age + 1
    }
}
fn main() {
    let person = Person::new(String::from("Jesserc"), 19);
    println!("{:?}", person.can_drink()); // false
    println!("{:?}", person.age_in_one_year()); // 20
    println!("{:?}", person.name); // "Jesserc"
}说明:
Trait 定义了类型间的共享行为,类似 Solidity 的接口。例如,为 Car 和 Boat 定义速度转换:
trait Speed {
    fn get_speed_kph(&self) -> f64;
}
struct Car {
    speed_mph: f64,
}
struct Boat {
    speed_knots: f64,
}
impl Speed for Car {
    fn get_speed_kph(&self) -> f64 {
        self.speed_mph * 1.60934 // 英里/小时转公里/小时
    }
}
impl Speed for Boat {
    fn get_speed_kph(&self) -> f64 {
        self.speed_knots * 1.852 // 节转公里/小时
    }
}
fn main() {
    let car = Car { speed_mph: 60.0 };
    let boat = Boat { speed_knots: 30.0 };
    println!("Car Speed: {} km/h", car.get_speed_kph()); // 96.5604 km/h
    println!("Boat Speed: {} km/h", boat.get_speed_kph()); // 55.56 km/h
}说明:Speed Trait 确保 Car 和 Boat 都实现 get_speed_kph。
在 Solana 的 Anchor 框架中,常用类函数宏(如 println!)、属性宏(如 #[program])和自定义派生宏(如 #[derive(Accounts)])。以下通过示例展示属性宏的强大能力。
我们创建一个属性宏,为结构体添加字段并生成方法。
项目设置
cargo new macro-demo --lib
cd macro-demo
touch src/main.rsCargo.toml:
[lib]
proc-macro = true
[dependencies]
syn = {version="1.0.57", features=["full","fold"]}
quote = "1.0.8"主程序(src/main.rs)
use macro_demo::*;
#[foo_bar_attribute]
struct MyStruct {
    baz: i32,
}
fn main() {
    let demo = MyStruct::default();
    println!("struct is {:?}", demo);... 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!