1 个不稳定版本
0.1.0 | 2022 年 12 月 7 日 |
---|
#124 in 金融
14KB
198 行
Katjing
一个探索 Rust 独特语言特性在安全货币管理中适用性的货币库。
Katjing 通过尽可能多地使用静态类型检查,包括 Rust 的借用检查和生命周期管理,旨在使货币管理尽可能安全。
功能概述
- 清晰的拥有权 Rust 跟踪拥有权
- 你不能将相同的货币实例给多个当事人
- 你不能在另一个实例借用时花费金钱
- 泛型货币 你不能将不同货币的金钱混合
- 分分表示 金钱的表示中没有浮点数,金钱表示中的任何逗号或点仅用于显示目的,不是金钱的属性
- 分离金钱和数量 数量不是金钱
- 独立建模的价格 价格可以被支付、消费金钱并留下找零
内容
这是什么?
Katjing 是一个 Money 库,旨在由处理货币交易和/或计算的应用程序和库使用。
为什么我应该使用这个?
目前如果你感到冒险。
用法
金钱可以用主要部分或分分来创建
use {
katjing::{
Money,
test::SEK
}
};
let one_sek=Money::<SEK>::new(1);
let one_sek_again=Money::<SEK>::in_minor_unit(100);
assert_eq!(one_sek, one_sek_again);
由于金钱是泛型的,它们不能混合(因为它们是不同类型)
use {
katjing::{
Money,
test::{SEK, EUR},
}
};
let one_sek=Money::<SEK>::new(1);
let one_eur=Money::<EUR>::new(1);
assert_eq!(one_sek, one_eur); // <-- will not compile
上面的示例将产生一个错误,类似于以下这样的错误
error[E0308]: mismatched types
--> src/lib.rs:96:1
|
12 | assert_eq!(one_sek, one_eur);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `SEK`, found struct `EUR`
|
= note: expected struct `Money<SEK>`
found struct `Money<EUR>`
让我们让事情更有趣,并介绍 Rust 的借用检查。
use {
katjing::{
Money,
test::SEK
}
};
fn moving_fn(money:Money<SEK>) {
// do something with owned money
}
let one_sek=Money::<SEK>::new(1);
moving_fn(one_sek);
moving_fn(one_sek); // <-- does not compile
我们创建一个克朗,将其赠送,然后再次尝试赠送。Rust 会抱怨你正在赠送不再属于你的金钱,如下所示
error[E0382]: use of moved value: `one_sek`
--> src/lib.rs:125:11
|
15 | let one_sek=Money::<SEK>::new(1);
| ------- move occurs because `one_sek` has type `Money<SEK>`, which does not implement the `Copy` trait
16 | moving_fn(one_sek);
| ------- value moved here
17 | moving_fn(one_sek);
| ^^^^^^^ value used here after move
类似地,你不能把已经送给别人的东西借给别人
use {
katjing::{
Money,
test::SEK
}
};
fn moving_fn(money:Money<SEK>) {
// do something with owned money
}
fn borrowing_fn(money:&Money<SEK>) {
// do something with borrowed money
}
let one_sek=Money::<SEK>::new(1);
moving_fn(one_sek);
borrowing_fn(&one_sek); // <-- does not compile
产生以下错误
error[E0382]: borrow of moved value: `one_sek`
--> src/lib.rs:162:14
|
19 | let one_sek=Money::<SEK>::new(1);
| ------- move occurs because `one_sek` has type `Money<SEK>`, which does not implement the `Copy` trait
20 | moving_fn(one_sek);
| ------- value moved here
21 | borrowing_fn(&one_sek); // <-- does not compile
| ^^^^^^^^ value borrowed here after move
虽然这是基本的 Rust,但它非常独特,我相信这可以非常有助于管理金钱,此外,金钱同样可以用于学习 Rust 的借用检查。
价格
价格不是金钱,它们表示成本,可以用于购买商品以改变所有权。Katjing 将价格建模为金钱的消费者。
use {
katjing::{
Money,
Price,
test::SEK
}
};
let ten_sek=Money::<SEK>::new(10);
let nine_sek_price=Price::<SEK>::new(9);
let (change, left_to_pay) = ten_sek.pay(nine_sek_price);
assert_eq!(left_to_pay, Price::<SEK>::new(0));
assert_eq!(change, Money::<SEK>::new(1));
依赖关系
~0.4–0.8MB
~21K SLoC