Rust : 声明宏在不同K线bar类型中的应用

devtools/2024/9/23 0:57:44/

Rust的宏功能博大精深。在K线bar中,往往有很多不同分时k线图,比如1,2,3,5,。。。。60,120,250,300…。。不同分钟类型。
如果不用宏,那么手写会比较麻烦。下面就试用一下宏来实现不同类型的bar.

一、数据和功能
bar的结构

为了简单起见,我们把不同分时的Bar抽象成下面的结构。

 struct Bar{open :f64,close:f64,high:f64,low:f64,}

同时这个结构要实现一个trait

trait BarPrint{fn print_self(&self);
}

二、单一bar的实现
我们先考虑,impl_single_bar接受单一的类型参数,比如Bar1,Bar3,Bar5,…

trait BarPrint{fn print_self(&self);
}// Bar1,Bar2,Bar3,Bar5,Bar10,Bar15,Bar30,Bar45,Bar60,.....
macro_rules!  impl_single_bar {($bar:ident) => (#[derive(Debug)]struct $bar{open:f64,close:f64,high:f64,low:f64,}impl $bar{fn new() -> Self{$bar{open:0.0,close:0.0,high:0.0,low:0.0,}}}impl BarPrint for $bar {fn print_self(&self){println!("impl_single_bar =>close:{:?} open: {:?}, high:{:?}, low:{:?}",&self.close,&self.open,&self.high,&self.low);}});
}
fn main(){impl_single_bar!(Bar1); //这个可以放在main()函数外,不影响let  bar = Bar1::new();println!("bar:{:?}",bar);bar.print_self(); impl_single_bar!(Bar2);let  bar2 = Bar2::new();println!("bar:{:?}",bar2);bar2.print_self(); 
}

输出:

bar:Bar1 { open: 0.0, close: 0.0, high: 0.0, low: 0.0 }
impl_single_bar =>close:0.0 open: 0.0, high:0.0, low:0.0
bar:Bar2 { open: 0.0, close: 0.0, high: 0.0, low: 0.0 }
impl_single_bar =>close:0.0 open: 0.0, high:0.0, low:0.0

这样的确方便了一些,但是因为参数是一个个输入,需要

impl_single_bar!(Bar1);
impl_single_bar!(Bar2);

每一个类型,写一行函数,还是不太方便。
注意:
1、impl_single_bar!(Bar1),可以放在main()函数外,不受影响;
2、$bar:ident,也可以是 $bar:tt。tt是分语树,比ident概念要大。

三、实现多类型参数输入

这里就需要用到rust宏的重复的写法。这里不特别展开,相关的资料很多。

1、试写一下生成多个类型的宏

macro_rules! create_bars{($($bar:ident),*) => {$(#[derive(Debug)]struct $bar{open:f64,close:f64,high:f64,low:f64,})*}}

2、上面也可以跳过,直接


trait BarPrint{fn print_self(&self);
}
macro_rules! impl_multi_bars{($($bar:ident),*) => {$(#[derive(Debug)]struct $bar{open:f64,close:f64,high:f64,low:f64,}impl $bar{fn new() -> Self{$bar{open:0.0,close:0.0,high:0.0,low:0.0,}}}impl BarPrint for $bar {fn print_self(&self){println!("impl_multi_bars => close:{:?} open: {:?}, high:{:?}, low:{:?}",&self.close,&self.open,&self.high,&self.low);}})*}      }
fn main(){create_bars!(Bar3,Bar4);let bar3 =Bar3{open:0.0,close:0.0,high:0.0,low:0.0};println!("bar3:{:?}",bar3);let bar4 =Bar4{open:0.0,close:0.0,high:0.0,low:0.0};println!("bar4:{:?}",bar4);// 测试生成多个struct Bar5,Bar6,Bar7,同时测试其实现的方法impl_multi_bars!(Bar5,Bar6,Bar7);//可以放在main()函数外,在main()函数内,直接调用即可。let  bar5 = Bar5::new();println!("bar5:{:?}",bar5);bar5.print_self();}

输出:

bar3:Bar3 { open: 0.0, close: 0.0, high: 0.0, low: 0.0 }
bar4:Bar4 { open: 0.0, close: 0.0, high: 0.0, low: 0.0 }
bar5:Bar5 { open: 0.0, close: 0.0, high: 0.0, low: 0.0 }
impl_multi_bars => close:0.0 open: 0.0, high:0.0, low:0.0

和2相比,你可需要把多个类型写到一行中就行了,即:

   impl_multi_bars!(Bar5,Bar6,Bar7);

http://www.ppmy.cn/devtools/33624.html

相关文章

学习java第六十一天

什么是控制反转(IOC)?什么是依赖注入(DI)? IoC(Inversion of Control) – 控制反转。它不是一种技术,而是一种思想。 IOC:就是对象之间的依赖关系由容器来创建,对象之间的关系本来是由我们开发者…

JavaScript继承的方法和优缺点

原型链继承 让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。 优点: 写法方便简洁,容易理解。 缺点: 在父类型构造函数中定义的引用类型值的实例属性,会在子类型原型上…

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包

本文来自:2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 - 源码1688 应用介绍 简介: 2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 自行检查后门,最好是部署智能合约后用合约地址来授权 包含转账支付页面盗U授…

SpringBoot使用AOP注解记录操作日志

一、前言 日志:指系统所指定对象的某些操作和其操作结果按时间有序的集合。 操作日志:主要是对某个对象进行新增操作或者修改操作后记录下这个新增或者修改,操作日志要求可读性比较强。比如张三在某个时间下了订单买了某个商品! …

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例,请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容: Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP,使AR4和AR3成为eBGP,AR4和AR5成为iBGP对等体…

500行代码实现贪吃蛇(1)

文章目录 目录1. Win32 API 介绍1.1 Win32 API1.2 控制台程序(Console)1.3 控制台屏幕上的坐标COORD1.4 [GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5 [GetConsoleCursorInfo](https://learn.microsoft.com/zh-c…