- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了 3 个结构和两种类型
type OnMoveEvent = fn(Board) -> ();
type OnGameOverEvent = fn(Player) -> ();
#[wasm_bindgen]
pub struct Game {
on_move: OnMoveEvent,
on_game_over: OnGameOverEvent,
board: Board,
}
#[wasm_bindgen]
pub struct Board {/* ... */}
#[wasm_bindgen]
pub struct Player {/* ... */}
所有 3 个结构都是 wasm_bindgen
并且类型不能标记为 wasm_bindgen
。然而,类型只是接受结构并返回 void
当我将 wasm_bindgen
添加到 Game
impl
时,出现以下错误
--> src/game.rs:16:1
|
16 | #[wasm_bindgen]
| ^^^^^^^^^^^^^^^ the trait `wasm_bindgen::convert::traits::FromWasmAbi` is not implemented for `fn(board::Board)`
那是因为new
有如下签名
pub fn new(on_move: OnMoveEvent, on_game_over: OnGameOverEvent) -> Game
在我看来,转换类型应该很简单,因为它们是接受 wasm_bindgen
结构的函数,但事实并非如此
这是一个错误还是我遗漏了什么?
完整代码 is here .
最佳答案
经过一些研究后回答我自己的问题:
因为我试图将一些函数从 JS 传递给 Rust,所以不能保证这些函数具有特定的签名。
相反,js-sys
crate 提供了一种方法 Receiving JavaScript Closures in Exported Rust Functions
我将代码更改为以下内容:
#[wasm_bindgen]
pub struct Game {
board: Board,
on_cpu_move: js_sys::Function,
on_game_over: js_sys::Function,
}
和新的
签名看起来像这样:
pub fn new(on_move: js_sys::Function, on_game_over: js_sys::Function) -> Game {
然后我需要调用一个 JS
消费者将要提供的回调,这样做是这样的:
...
let state = self.board.state();
let this = JsValue::NULL;
if state.game_over {
let _ = self.on_game_over.call0(&this);
} else {
let board = JsValue::from(self.board);
let _ = self.on_cpu_move.call1(&this, &board);
}
...
由 JS
消费者来确保他们提供正确的类型。
希望有人觉得它有用。
关于rust - FromWasmAbi 没有为 fn(SomeStruct) 实现,而 SomeStruct 是 #[wasm_bindgen],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53682219/
我定义了 3 个结构和两种类型 type OnMoveEvent = fn(Board) -> (); type OnGameOverEvent = fn(Player) -> (); #[wasm_
假设 SomeStruct 定义为: struct SomeStruct { int member; }; 这些是什么意思? &SomeStruct::member int SomeStruc
const Vector4 colorBlack = new Vector4(0,0,0,1);//Vector4 is struct public static void example(Vecto
考虑以下几点: struct SomeStruct {} var foo: Any! let bar: SomeStruct = SomeStruct() foo = bar // Compiles
考虑以下几点: struct SomeStruct {} var foo: Any! let bar: SomeStruct = SomeStruct() foo = bar // Compiles
我试图理解 ORM 库的这段代码,但我无法理解 (*User)(nil) 的含义?第一个括号是指向 User 结构的指针,那么第二个括号代表什么? type User struct { Id
我想获取结构中特定成员的大小。 sizeof(((SomeStruct *) 0)->some_member) 对我有用,但我觉得可能有更好的方法。 我可以#define SIZEOF_ELEM(ST
我不小心输入了一个默认的可初始化对象 struct至 std::numeric_limits::infinity() .我得到的是一个默认结构。 为什么标准允许它编译并返回这样一个意想不到的值? #i
我有一个或多或少像这样的结构: [Serializable] [XmlRoot("Customer")] public struct TCustomer { string CustomerNo;
假设我有很多带有接收器的函数或方法,每个函数或方法都有不同类型的参数。我想使用表驱动方法来调度函数或方法调用。所以我将构建一个这样的表: type command struct { name s
我正在查看一些使用的代码 Rc> 所以我出去阅读了 Rc 和 RefCell 之间的差异: 以下是选择 Box、Rc 或 RefCell 的原因的概述: Rc enables multiple own
我在这里做了一些比较: https://github.com/itchingpixels/structs-vs-classes似乎将结构插入结构数组比将类插入类数组(具有相同数据)慢 10 倍。 我的
例如: type name struct { name string age int } func main() { c := make(chan name)
给定 SomeStruct 如下: struct SomeStruct { int i; char c; }; 下面不编译。 int main() { std::array a
谁能解释一下这个错误是什么意思?这实际上是相同的结构。它是否无法以某种方式推断出 R 或 F 并以这种方式报告? src/demo.rs:113:51: 113:65 error: mismatche
主题。用例是:假设我有一个非托管缓冲区,用于存储 SomeStruct 的 N 个实例。 .所以在这个缓冲区中有一个地址,有没有办法把这个地址转换成ref SomeStruct -- 例如能够直接更新
这里有一些设置代码来解释正在发生的事情: protocol CanJump{ func jump() } struct Dog: CanJump{ func jump(){
我有一个结构 type mapKey string var key1 mapKey = "someKey" var key2 mapKey = "anotherKey" type SampleMap
当我尝试使用用户定义的转换运算符从接口(interface)类型转换为通用结构类型时,出现编译错误,指出类型无法转换: public interface J { } public struct S {
我是一名优秀的程序员,十分优秀!