0

使用wasm_bindgenwith serde,我正在尝试JsValue使用惯用的 rust 返回一个复杂结构。我创建了一个孤立的示例来说明我看到的错误。

结构声明:

#[derive(Serialize)]
pub struct BookStoreData {
    pub h: HashMap<String, String>,
    pub name: String,
}

函数定义:

#[wasm_bindgen]
pub fn hello_hash(count: i32) -> Result<JsValue, JsValue> {
    set_panic_hook();
    let mut book_reviews = HashMap::new();

    book_reviews.insert(
        "Grimms' Fairy Tales".to_string(),
        "Masterpiece.".to_string(),
    );
    let data = BookStoreData {
        h: book_reviews,
        name: "My Book Store".to_string(),
    };

    let js_result: JsValue = JsValue::from_serde(&data).unwrap();

    OK(js_result)    

}

我得到这个编译错误:

error[E0425]: cannot find function `OK` in this scope
  --> src/hello_whatever.rs:46:5
   |
46 |     OK(js_result)    
   |     ^^ help: a tuple variant with a similar name exists: `Ok`

您可以查看基于rust-parcel-template的完整示例

要重现错误,请从 repo 的根目录运行npm run startcd crate && cargo build

4

1 回答 1

3

答案是作为评论提供的。 Ok用小写字母拼写,k但没有解释错误信息的含义。

首先,这是一个小改动的工作代码:

#[wasm_bindgen]
pub fn hello_hash(count: i32) -> Result<JsValue, JsValue> {
    set_panic_hook();
    let mut book_reviews = HashMap::new();

    book_reviews.insert(
        "Grimms' Fairy Tales".to_string(),
        "Masterpiece.".to_string(),
    );
    let data = BookStoreData {
        h: book_reviews,
        name: "My Book Store".to_string(),
    };

    let js_result: JsValue = JsValue::from_serde(&data).unwrap();

    Ok(js_result)    

}

其次,什么是元组变体?

在这种情况下,有问题的行可能是结构或枚举的函数或元组变体(通过友好的 Rustacean 的推文):

元组可以在结构或枚举中使用:

struct S(usize); // tuple-like struct
enum E {
    T(usize), // tuple variatn
}

博客文章中的更多详细信息:什么是元组变体?

将来可能会改进此特别令人困惑的错误消息。博客文章和随后的推特讨论导致了这个错误报告:https ://github.com/rust-lang/rust/issues/65386

于 2019-04-23T01:12:25.050 回答