#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