gpt4 book ai didi

node.js - 从 NodeJS 调用 Rust

转载 作者:搜寻专家 更新时间:2023-10-31 22:40:57 32 4
gpt4 key购买 nike

我想学习如何从 node 中使用 rust,所以这就是我构建这个项目的原因。

我的问题是我不知道如何调用 ffi使用正确的类型运行。

var lib = ffi.Library('target/debug/libmain', {
'get_soup': ['Vec<Post>', ['String']]
});

'Vec<Post>'不起作用。我知道我必须使用 ref为了那个原因。但我真的不知道那实际上是如何以及做什么的。

我知道我必须将 rust 类型转换为 javascript?

我如何使用 Vec<Post>在我的 ffi 函数中?

我的 github 项目:Realtin/suppe

这里是相关代码:

防 rust 代码:

extern crate rss;
extern crate hyper;

use rss::Rss;
use std::io::prelude::*;

#[derive(Debug)]
pub struct Post {
title: String,
link: String,
description: String,
}

fn main() {
let user = "realtin".to_string();
let vec = get_soup(&user);
println!("{:?}", vec[vec.len()-1]);
}

#[no_mangle]
pub extern fn get_soup(user: &str) ->Vec<Post>{
let url = format!("http://{}.soup.io/rss", user);
let mut vec = Vec::new();

let client = hyper::Client::new();
let mut response = client.get(&url).send().unwrap();

let mut suppe = String::new();
let _= response.read_to_string(&mut suppe);

let rss::Rss(channel) = suppe.parse::<rss::Rss>().unwrap();

for item in channel.items.into_iter().rev() {
let item_object = Post {
title: item.title.unwrap(),
link: item.link.unwrap(),
description: item.description.unwrap(),
};
vec.push(item_object);
}
return vec;
}

NodeJS 代码:

var ref = require('ref');
var StructType = require("ref-struct");
var ffi = require('ffi');

var Post = StructType({
title: String,
link: String,
description: String,
});
// var vecPost = ref.refType(ref.types.Object);

var lib = ffi.Library('target/debug/libmain', {
'get_soup': ['Vec<Post>', ['String']]
});

var posts = lib.get_soup("realtin");

最佳答案

简短的回答:您不能为 FFI 绑定(bind)导出任何 Rust 函数,您需要专门导出与 C 兼容的 Rust 函数。

具体来说,这意味着您只需要公开 C 结构兼容对象或公开不透明指针(只能通过 Rust 函数进行操作)。

在你的例子中,Vec<Post>与 FFI 中的用法不兼容,因为 Vec不是。

您可以在 FFI Guide 中找到更多信息.

关于node.js - 从 NodeJS 调用 Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32120031/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com