#javascript-engine #quickjs #binding #api-bindings #context #macro

qjs

Rust 编译 QuickJS JavaScript 引擎的绑定

3 个版本

0.1.2 2019 年 8 月 27 日
0.1.1 2019 年 8 月 16 日
0.1.0 2019 年 7 月 26 日

23 in #quickjs


用于 qjs-derive

MIT 许可证

1MB
6K SLoC

qjs travis Build status crate docs dependency status

qjs 是 QuickJS JavaScript 引擎的实验性 Rust 绑定

用法

要在项目中使用 qjs,请将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
qjs = "0.1"

示例

let v: Option<i32> = qjs::eval("1+2").unwrap();

assert_eq!(v, Some(3));

lib.rs:

qjs 是 QuickJS JavaScript 引擎的实验性 Rust 绑定

示例

qjs 宏可以在匿名上下文中执行 JavaScript 代码。

use qjs::qjs;

let v: i32 = qjs!(1+2).unwrap().unwrap();

assert_eq!(v, 3);

qjs 宏还可以将 JavaScript 闭包转换为 Rust 函数。

use qjs::qjs;

let f = qjs!{ (name: &str) -> String => { return "hello " + name; } };
let s: String = f("world").unwrap().unwrap();

assert_eq!(s, "hello world");

变量插值使用 #var 完成(类似于 $varmacro_rules! 宏中)。这会获取当前作用域中的 var 变量,并在输出令牌的相应位置插入它。

use qjs::qjs;


let f = |name| qjs!{ "hello " + #name };
let s: String = f("world").unwrap().unwrap();

assert_eq!(s, "hello world");

原始类型,包括 booli32i64u64f64String 等,以及实现 NewValue 特质的其他类型可以在变量插值中使用。

参数实现 ExtractValue 特质且输出类型实现 NewValue 特质的函数也可以用于变量插值。

use qjs::qjs;

fn hello(name: String) -> String {
    format!("hello {}", name)
}

let hello: fn(String) -> String = hello;
//let s: String = qjs!{ #hello ("world") }.unwrap().unwrap();

// assert_eq!(s, "hello world");

依赖项

~2.4–5MB
~82K SLoC