Почему строка, передаваемая из JavaScript в Wasm, всегда пуста в разделе 4.2 книги для начинающих Rust / Wasm?

#rust #webassembly

#Ржавчина #webassembly

Вопрос:

Я пытаюсь следовать книге Rust WebAssembly, и я застрял в упражнении в разделе 4.2. Я изменил все, как описано в ответе, но заданное amp;str (имя) в greet функции всегда пустое.

Вот моя версия greet функции с отладкой

 #[wasm_bindgen]
pub fn greet(name: amp;str) {
    if name.len() == 0 {
        alert("NOT WORKING!");
    } else {
        alert(amp;format!("Hello, {}!", name));
    }
}
  

И www/index.js файл:

 import * as wasm from "wasm-game-of-life";

wasm.greet("213");
  

Вот сгенерированная функция в pkg/wasm_game_of_life.js

 /**
* @param {string} name
* @returns {void}
*/
export function greet(name) {
    const ptr0 = passStringToWasm(name);
    const len0 = WASM_VECTOR_LEN;
    try {
        return wasm.greet(ptr0, len0);

    } finally {
        wasm.__wbindgen_free(ptr0, len0 * 1);

    }

}
  

Я получаю всплывающее окно с текстом NOT WORKING! , но я ожидаю Hello, 213 ! Почему моя строка пуста? Книга устарела или что-то в этом роде? Я удалил все и начал с нуля, но безуспешно…

Я слежу за книгой, это мои первые часы работы с WebAssembly.

Комментарии:

1. Вы правильно связали локальный модуль npm? Вам нужно использовать npm link в pkg каталоге и npm link wasm-game-of-life в www каталоге?

2. Я только что следовал инструкциям (впервые), и это сработало для меня. Я использую последнюю версию Rust 1.34, поэтому не думаю, что книга устарела.

3. @PeterHall Я думаю, что я связал все правильно, потому alert("NOT WORKING!"); что выполняется. Я снова все удалю и начну с нуля. Я также протестирую это в своей macOS в данный момент, когда я работаю над Ubuntu 18.04. Я также работаю с последней версией rust. Приятно знать, что это работает в целом, поэтому в моей среде есть что-то жуткое.

Ответ №1:

Я знаю, что, вероятно, уже поздно, но сегодня я столкнулся с той же проблемой, и это похоже на это. Итак, для всех, кто столкнулся с этим, вот ответ:

При импорте import * as wasm from "wasm-game-of-life"; в wasm переменной у вас есть модуль, экспортированный из библиотеки rust. Он содержит greet метод, но он не определен в файле JS, это функция C, которая принимает два аргумента, указатель на строку и ее длину.

Когда вы вызываете wasm.greet() параметр string, вы передаете его функции C, а не функции JS greet — вот почему вызов функции работает, но строка фактически не передается.

Чтобы вызвать greet оболочку JS, вы должны явно импортировать ее (заменить путями к файлам js):

 import { default as wasm, greet } from "wasm-game-of-life"

wasm().then((module) => {
  module.greet("Test");  // this won't work, it's C/rust greet function
  console.log(module);
  greet("Test");  // this should work! it's js wrapper around C function
})
  

Ответ №2:

Вам понадобится link пакет, который не указан в оригинальном руководстве:

в wasm-game-of-life/pkg run

 npm link  #or yarn link
  

затем в wasm-game-of-life/www run

 npm link wasm-game-of-life  #or yarn link wasm-game-of-life
  

ссылка: https://github.com/rustwasm/book/issues/144