8 个版本

0.3.4 2024 年 4 月 3 日
0.3.3 2024 年 3 月 13 日
0.2.2 2024 年 1 月 18 日

#577解析器实现

Download history 4/week @ 2024-05-18 1/week @ 2024-05-25

580 每月下载量

MIT 许可证

345KB
8K SLoC

Polyvalue

Rust 的动态类型系统

Crates.io Build Status License

lavendeux-parser 构建

类型

值可以是 bool、int、float、fixed、currency、string、array、object 或 range。

所有类型都实现了 Hash、Ord、Eq、Serialize、Deserialize、Clone、Debug 和 Default

不同类型的值在执行操作时将被强制转换为同一类型。

这是通过以下顺序完成的

  • 如果任一类型是对象,则将其他类型强制转换为对象。这是通过首先将类型 T 转换为数组 [T],然后将数组转换为形式为 {0: T} 的对象来完成的。
  • 如果任一类型是数组,则将其他类型强制转换为数组。
  • 如果任一类型是字符串,则将其他类型强制转换为字符串。

此时,剩余的类型是数值,将被强制转换为包含最多信息的类型。顺序为

  • 货币
  • Fixed
  • Float
  • Int (I64, U64, ... 降至 U8)
  • Bool

操作

可以在 Value 上直接执行操作,或在内部类型上执行操作。对 Value 的操作将强制内部类型转换为同一类型,然后执行操作。

有 5 种操作类型:算术、位、布尔、比较和索引。

位运算

  • 位非将尝试移除包含类型宽度的效果,以移除尾随的 0xF
  • 负 RHS 移位将导致向相反方向移位(例如; 1>>-1 == 1<<1),并且值 >64 使用 r%64 包装

用法

use polyvalue::{Value, Int, Float, Fixed, Currency, Str, Array, Object, Range};

fn main() {
    let v = Value::from(1);
    assert_eq!(v, Value::Int(Int::new(1)));

    let v = Value::from(1.0).arithmetic_op(Value::from(2.0), ArithmeticOperation::Add).unwrap();
    assert_eq!(v, Value::Float(Float::new(3.0)));
}

此软件包是为在解析器中使用而构建的,其中值的类型在运行时未知。如果您有任何改进建议,请提出问题。

依赖关系

~3–5MB
~96K SLoC