#rust #wasm-bindgen
#Ржавчина #wasm-привязка
Вопрос:
Используя wasm_bindgen
with 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(amp;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
Чтобы воспроизвести ошибку из корня репозитория, запустите npm run start
или cd crate amp;amp; cargo build
Комментарии:
1. Используйте
Ok
вместоOK
smallk
2. Я не могу поверить, что я этого не видел. Справочное сообщение должно было быть полезным. Я просто продолжал перечитывать его и задавался вопросом, как Ok может иметь несколько вариантов кортежей, и пропустил разницу в капитализации. Спасибо @sn99 !
Ответ №1:
ответ был предоставлен в виде комментария. 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(amp;data).unwrap();
Ok(js_result)
}
Во-вторых, что такое вариант кортежа?
В этом контексте рассматриваемая строка может быть функцией или вариантом кортежа структуры или перечисления (через твит дружественного Rustacean):
кортежи могут использоваться в структуре или перечислении:
struct S(usize); // tuple-like struct
enum E {
T(usize), // tuple variant
}
Более подробно в сообщении в блоге: Что такое вариант кортежа?
Это конкретное запутанное сообщение об ошибке может быть улучшено в будущем. Сообщение в блоге и последующее обсуждение в Твиттере привели к этому сообщению об ошибке: https://github.com/rust-lang/rust/issues/65386