3 个版本

0.1.2 2023 年 4 月 24 日
0.1.1 2022 年 7 月 26 日
0.1.0 2022 年 7 月 16 日

#605 in 数学

Download history 30/week @ 2024-03-30 5/week @ 2024-04-06

62 每月下载量
2 crates 中使用

GPL-3.0-only

82KB
2K SLoC

resolver

源代码

此作品是以下仓库的衍生品: https://github.com/fengcen/eval

上述仓库已被遗弃,因此创建了此仓库/crate。


特性

支持的运算符: ! != "" '' () [] , > < >= <= == + - * / % && || n..m

内置函数: min() max() len() is_empty() array()

eval 可在哪里使用?

  • 模板引擎
  • ...

用法

在 Cargo.toml 中添加依赖项

[dependencies]
resolver = "^0.1"

在您的 main.rslib.rs

extern crate resolver;

示例

您可以使用支持的运算符进行数学计算

use resolver::{eval, to_value};

assert_eq!(eval("1 + 2 + 3"), Ok(to_value(6)));
assert_eq!(eval("2 * 2 + 3"), Ok(to_value(7)));
assert_eq!(eval("2 / 2 + 3"), Ok(to_value(4.0)));
assert_eq!(eval("2 / 2 + 3 / 3"), Ok(to_value(2.0)));

您可以在上下文中评估

use resolver::{Expr, to_value};

assert_eq!(Expr::new("foo == bar")
               .value("foo", true)
               .value("bar", true)
               .exec(),
           Ok(to_value(true)));

您可以通过使用 .[] 来访问数据,就像javascript一样。 [] 支持表达式。

use resolver::{Expr, to_value};
use std::collections::HashMap;

let mut object = HashMap::new();
object.insert("foos", vec!["Hello", "world", "!"]);

assert_eq!(Expr::new("object.foos[1-1] == 'Hello'")
               .value("object", object)
               .exec(),
           Ok(to_value(true)));

您可以使用函数进行评估

use resolver::{Expr, to_value};

assert_eq!(Expr::new("say_hello()")
               .function("say_hello", |_| Ok(to_value("Hello world!")))
               .exec(),
           Ok(to_value("Hello world!")));

您可以使用 array() 创建一个数组

use resolver::{eval, to_value};

assert_eq!(eval("array(1, 2, 3, 4, 5)"), Ok(to_value(vec![1, 2, 3, 4, 5])));

您可以使用 n..m 创建一个整数数组

use resolver::{eval, to_value};

assert_eq!(eval("0..5"), Ok(to_value(vec![0, 1, 2, 3, 4])));

许可证

解析器遵循 GPL-3.0-only 许可协议。

有关详细信息,请参阅 LICENSE

依赖项

~0.7–1.5MB
~33K SLoC