Что такое вариант кортежа? (понимание сообщения об ошибке компилятора)

#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 small k

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