#money #management #language #safe #currency #unique

katjing

一个探索 Rust 独特语言特性在安全货币管理中适用性的货币库。

1 个不稳定版本

0.1.0 2022 年 12 月 7 日

#124 in 金融

MIT/Apache

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