带有字符串的Rust-wasm-bindgen结构



我正在尝试导出以下结构:

#[wasm_bindgen]
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum TokenType {
KeywordLiteral,
NumberLiteral,
Operator,
Separator,
StringLiteral,
}
#[wasm_bindgen]
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct Token {
pub typ: TokenType,
pub val: String,
}

但我得到了:

error[E0277]: the trait bound `token::TokenType: std::marker::Copy` is not satisfied
--> srctokenizertoken.rs:17:14
|
14 | #[wasm_bindgen]
| --------------- required by this bound in `__wbg_get_token_typ::assert_copy`
...
17 |     pub typ: TokenType,
|              ^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `token::TokenType`

以及:

error[E0277]: the trait bound `std::string::String: std::marker::Copy` is not satisfied
--> srctokenizertoken.rs:18:14
|
14 | #[wasm_bindgen]
| --------------- required by this bound in `__wbg_get_token_val::assert_copy`
...
18 |     pub val: String,

我可以将#[derive(Copy)]添加到TokenType,但不能将String添加到。

我是新手,所以非常感谢你的帮助。

根据wasm bindgen#1985,结构的公共字段必须是Copy,才能使自动生成的访问器发挥作用。

您可以将字段设为私有字段,也可以使用#[wasm_bindgen(skip)]对其进行注释,然后直接实现getter和setter。

wasm-bindgen的文档中提供了一个描述如何编写这些内容的示例:

#[wasm_bindgen]
pub struct Baz {
field: i32,
}
#[wasm_bindgen]
impl Baz {
#[wasm_bindgen(constructor)]
pub fn new(field: i32) -> Baz {
Baz { field }
}
#[wasm_bindgen(getter)]
pub fn field(&self) -> i32 {
self.field
}
#[wasm_bindgen(setter)]
pub fn set_field(&mut self, field: i32) {
self.field = field;
}
}

当对象在wasm和js之间共享时,js对象只包含指向wasm运行时内存中结构的指针。当您访问JS中的字段时,它会经过一个定义的属性,该属性会对wasm代码进行函数调用,要求它提供属性值(您可以将wasm内存视为位UInt8Array(。

要求对象为Copy可能是为了避免在自动生成这些getter和setter时出现意外。如果您手动实现它们,您可以在JS中具有相同的行为,并能够控制在rust端设置的内容。

相关内容

  • 没有找到相关文章

最新更新