11 个版本
0.1.3 | 2024年7月1日 |
---|---|
0.1.2 | 2024年2月25日 |
0.0.9 | 2023年8月28日 |
0.0.7 | 2023年7月9日 |
0.0.5 | 2023年5月29日 |
#70 in 无标准库
29KB
132 行
auto-delegate
支持 no_std
此库是在没有 std 包的情况下创建的。
描述
自动委派允许您自动实现特质并将它们的处理委派给子。
用法
结构体
将 'delegate' 属性赋予要委派的特质,将 'Delegate' 赋予请求委派的结构体
示例1
use auto_delegate::{Delegate, delegate};
#[delegate]
trait Calc {
fn calc(&self, x1: usize, x2: usize) -> usize;
}
#[derive(Default)]
struct CalcAdd;
impl Calc for CalcAdd {
fn calc(&self, x1: usize, x2: usize) -> usize {
x1 + x2
}
}
#[derive(Delegate, Default)]
struct Parent {
#[to(Calc)]
child: CalcAdd
}
fn main() {
let parent = Parent::default();
assert_eq!(parent.calc(2, 3), 5);
}
示例2:多个特质量和字段
use auto_delegate::*;
#[delegate]
trait Calc {
fn calc(&self, x1: usize, x2: usize) -> usize;
}
#[derive(Default)]
struct CalcAdd;
impl Calc for CalcAdd {
fn calc(&self, x1: usize, x2: usize) -> usize {
x1 + x2
}
}
#[delegate]
trait Movable {
fn move_to(&mut self, pos: (usize, usize));
fn pos(&self) -> (usize, usize);
}
#[delegate]
trait Resizable {
fn resize(&mut self, width: usize, height: usize);
fn size(&self) -> (usize, usize);
}
#[derive(Default)]
struct Transform2D {
pos: (usize, usize),
width: usize,
height: usize
}
impl Movable for Transform2D {
fn move_to(&mut self, pos: (usize, usize)) {
self.pos = pos;
}
fn pos(&self) -> (usize, usize) {
self.pos
}
}
impl Resizable for Transform2D {
fn resize(&mut self, width: usize, height: usize) {
self.width = width;
self.height = height;
}
fn size(&self) -> (usize, usize) {
(self.width, self.height)
}
}
#[derive(Default, Delegate)]
struct Parent<T: Default + Calc> {
#[to(Movable, Resizable)]
transform: Transform2D,
#[to(Calc)]
calculator: T
}
fn main() {
let mut parent = Parent::<CalcAdd>::default();
assert_eq!(parent.calc(3, 2), 5);
parent.move_to((10, 11));
assert_eq!(parent.pos(), (10, 11));
parent.resize(100, 120);
assert_eq!(parent.size(), (100, 120));
}
枚举
类似于结构体,枚举可以使用 'Delegate' 进行委派。
示例
use auto_delegate::{delegate, Delegate};
#[delegate]
trait Calc {
fn calc(&self, x1: usize, x2: usize) -> usize;
}
#[derive(Default)]
struct CalcAdd;
impl Calc for CalcAdd {
fn calc(&self, x1: usize, x2: usize) -> usize {
x1 + x2
}
}
#[derive(Default)]
struct CalcSub;
impl Calc for CalcSub {
fn calc(&self, x1: usize, x2: usize) -> usize {
x1 - x2
}
}
#[derive(Delegate)]
#[to(Calc)]
enum EnumCalc {
Add(CalcAdd),
Sub(CalcSub),
}
fn main() {
let c = EnumCalc::Add(CalcAdd::default());
assert_eq!(c.calc(3, 5), 8);
let c = EnumCalc::Sub(CalcSub::default());
assert_eq!(c.calc(3, 2), 1);
}
待办事项
- 支持自接收器(v0.0.8)
- 支持无接收器的方法(v0.1.0)
- 支持返回 impl 类型的特质方法。
依赖项
~290–740KB
~18K SLoC