文章

Rust代码片段

结构体实现默认值

use std::fs;
use toml::from_str;
use serde::Deserialize;
macro_rules! default_struct {
    ($name:ident { $($field:ident: $ty:ty = $value:expr),* }) => {
        #[derive(Debug, Deserialize)]
        struct $name {
            $(pub $field: Option<$ty>),*
        }

        impl Default for $name {
            fn default() -> Self {
                $name {
                    $($field: Some($value)),*
                }
            }
        }

        impl $name {
            fn with_defaults(&self) -> Self {
                let default = Self::default();
                $name {
                    $($field: self.$field.clone().or(default.$field)),*
                }
            }
        }
    };
}

default_struct! {
    Config {
        port: u16 = 8080,
        host: String = "127.0.0.1".to_string(),
        debug: bool = false
    }
}

fn main() {
    let config_content = fs::read_to_string("config.toml").expect("无法读取配置文件");
    let config: Config = from_str::<Config>(&config_content).unwrap_or_default().with_defaults();
    println!("{:#?}", config);
}

实现多参数函数

macro_rules! add {  
    ($($x:expr),*) => {{  
        let mut sum = 0.0;  
        $(  
            sum += $x as f64;  
        )*  
        sum  
    }};  
}  
  
fn main() {  
    // 测试多个整数和浮点数相加  
    let result = add!(8, 3.0, 2, 1.5, 4);  
    println!("相加结果: {}", result); // 输出: 相加结果: 15.5  
  
    // 测试单个整数和浮点数相加  
    let single_result = add!(5, 3.0);  
    println!("相加结果: {}", single_result); // 输出: 相加结果: 8.0  
  
    // 测试只有整数相加  
    let int_result = add!(5, 3, 2);  
    println!("相加结果: {}", int_result); // 输出: 相加结果: 10.0  
  
    // 测试只有浮点数相加  
    let float_result = add!(5.0, 3.0, 2.5);  
    println!("相加结果: {}", float_result); // 输出: 相加结果: 10.5  
}
许可协议:  GPL V3