lua使用rust代碼(第二期)--String

lua使用rust代碼--第二期

前言

lua自己提供來ffi庫,來完成對C語言的對接(其實是動態鏈接庫*.so)。調用rust代碼也是經過這個ffi。那麼對於structstd::string::String,Vec\<struct\>,也因該保持其與C代碼有相同的結果。數組

背景知識
對於數組在C中就是指向數組中第一個元素的指針。爲了防止內存過界,全部數組操做必須獲取數組的長度。在rust代碼中數組的長度(len)和大小(cap)已經被封裝。

std::string::String

string在C裏就是char的指針。ui

rust

use std::ffi::CString;
use std::os::raw::{c_char, c_int};

#[no_mangle]
pub extern "C" fn get_string(len *mut c_int) -> *const c_char{
	let rust_string = String::from("這時一個字符串");
	let c_string = CString::new(coco.remote_addr.as_str()).unwrap();
	len = rust_string.len() as c_int;//獲取字符串長度
	let c_string_ptr = c_string..as_ptr();
	std::mem::forget(c_string);//避免被drop
	c_string_ptr
}

lua

ffi = require("ffi")
ffi.cdef[[
    char  * get_all_data(int*);
]]

local rust_lib = ffi.load("libexample.so")
local intPtr = ffi.typeof("int[1]")--初始化int*
local function get_string()
	local c_len = intPtr()
	local c_string = rust_lib.get_string(c_len)
	local lua_len = c_len[0]
	local lua_string =  ffi.string(c_string,lua_len)
	return lua_string
end
print(get_string())
相關文章
相關標籤/搜索