Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用wasm包构建时在Rust和JavaScript之间传递字符串_Rust_Webassembly_Rust Cargo_Wasm Bindgen_Wasm Pack - Fatal编程技术网

使用wasm包构建时在Rust和JavaScript之间传递字符串

使用wasm包构建时在Rust和JavaScript之间传递字符串,rust,webassembly,rust-cargo,wasm-bindgen,wasm-pack,Rust,Webassembly,Rust Cargo,Wasm Bindgen,Wasm Pack,我正在构建一个Chrome扩展,我选择使用一些WebAssembly功能。我使用wasm包来构建源代码,因为它提供了一个--目标web,降低了插入wasm函数的复杂性。在Rust和JS之间传递整数值可以无缝地工作,但我似乎无法将字符串传递给Rust,反之亦然 以下是我的工作内容: #[wasm#u bindgen] 外部“C”{ fn警报(s:&str); #[wasm_bindgen(js_namespace=console)] fn日志(x:&str); } #[瓦斯穆宾根] 发布外部“C

我正在构建一个Chrome扩展,我选择使用一些WebAssembly功能。我使用wasm包来构建源代码,因为它提供了一个
--目标web
,降低了插入wasm函数的复杂性。在Rust和JS之间传递整数值可以无缝地工作,但我似乎无法将字符串传递给Rust,反之亦然

以下是我的工作内容:

#[wasm#u bindgen]
外部“C”{
fn警报(s:&str);
#[wasm_bindgen(js_namespace=console)]
fn日志(x:&str);
} 
#[瓦斯穆宾根]
发布外部“C”fn添加两个(x:i32)->i32{
x+2
}
#[瓦斯穆宾根]
发布fn hello(名称:&str){

log(“Hello”)/问题在于如何加载代码:

(异步函数(){
//获取JS文件
const src=wait import(“/pkg/rusty.js”);
//获取wasm文件。
const wasm_src=chrome.extension.getURL(“/pkg/rusty_bg.wasm”);
//src有一个导出函数“default”,用于初始化WebAssembly模块。
设wasm=wait src.default(wasm_src);
你好(“堆栈溢出”);
})();
wasm
返回。默认(…)
是具有原始WebAssembly导出的对象,该导出只能对原始编号进行操作

在本例中发生的情况是,
wasm.hello
需要两个整数-指针和WebAssembly内存中字符串的长度-JavaScript愉快地转换
“堆栈溢出”
0
,并提供另一个
0
作为默认值,这就是为什么最后会出现一个空字符串

相反,您需要的是负责正确转换的函数的包装版本。这些直接在导入
.js
文件时生效:

(异步函数(){
//获取JS文件
const rusty=wait import(“/pkg/rusty.js”);
//获取wasm文件。
const wasm_src=chrome.extension.getURL(“/pkg/rusty_bg.wasm”);
//rusty有一个导出函数“default”,用于初始化WebAssembly模块。
等待生锈。默认值(wasm_src);
rusty.hello(“堆栈溢出”);//它可以工作!
})();

您的问题可能由的答案来回答。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。最小的区别在于,发布的问题不使用wasm bindgen。这意味着我应该能够传递一个字符串,因为它会对我的行为造成所有繁重的工作lf.您显示的所有选项都应该确实有效;上面代码中似乎没有显示的问题是如何获取调用函数的
wasm
对象。请确保您正在导入生成的主要JavaScript模块,而不仅仅是直接导入WebAssembly文件。@r相反。我正在chrome中运行此操作扩展。这意味着我必须使用wasm pack来获得可用的JS输出,这些输出可以轻松地导入到我的扩展文件中。
wasm pack build--target web--features wee_alloc
。它输出一个带有JS的pkg目录,可以在chrome中加载而无需任何导入errors@mar-蒂娜,这仍然不能说明你是如何得到wasm的de>object。你能更新代码片段以显示你是如何导入生成的包的吗?很好!非常感谢。我花了一天的时间才找到这个。
(async function() {
  // Get the JS File
  const src = await import("/pkg/rusty.js");
  // Fetch the wasm file.
  const wasm_src = chrome.extension.getURL("/pkg/rusty_bg.wasm");
  //src has an exported function 'default' that initializes the WebAssembly module.
  let wasm = await src.default(wasm_src);

  wasm.hello("stack-overflow");
})();