8 个版本
0.3.4 | 2024 年 4 月 3 日 |
---|---|
0.3.3 | 2024 年 3 月 13 日 |
0.2.2 | 2024 年 1 月 18 日 |
#577 在 解析器实现
580 每月下载量
345KB
8K SLoC
Polyvalue
Rust 的动态类型系统
为 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