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