extern "rust-call" fn call_mut( &mut self, args: Args ) -> Self::Output; } FnOnce 是 FnMut 的 super trait。 FnMut也有FnOnce里的 Output 这个关联类型和call_once这个方法。 还有自己的一个call_mut方法。 可以看到call_mut 的参数是 &mut self,它并不转移self,所以可以多次调用。 如果想要在Fn...
先看源码: pubtraitFn<Args:Tuple>:FnMut<Args>{/// Performs the call operation.#[unstable(feature ="fn_traits", issue ="29625")]extern"rust-call"fncall(&self,args:Args)->Self::Output;}pubtraitFnMut<Args:Tuple>:FnOnce<Args>{/// Performs the call operation.#[unstable(feature ="fn...
extern"rust-call"fncall_once(self, args: (u32, ))->Self::Output {} } implFnMut<(u32, )>forClosureEnvironment{ extern"rust-call"fncall_mut(&mutself, args: (u32, ))->Self::Output {} } implFn<(u32, )>forClosureEnvironment{ ...
extern"rust-call"fncall_once(self, args: Args) -> Self::Output; } 参数类型是self,所以,这种类型的闭包会获取变量的所有权,生命周期只能是当前作用域,之后就会被释放了。 FnOnce例子: #[derive(Debug)] structE { a:String, } implDropfor E { fndrop(&mutself) { println!("destroyed struct E"...
extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output; } 1. 2. 3. 2.2.3. Fn 最后看一下Fn的源码,参数类型是&self,此类型的闭包是不变借用,不会改变变量,也不会释放该变量。 pub trait Fn<Args>: FnMut<Args> { ...
但是看三个 traits 的源代码,可以直接回答上述问题:是不可变借用。虽然确实也实现了FnOnce,但并没有调用FnOnce的 call 函数,而是调用了Fn的 call 函数。 pubtraitFn<Args>:FnMut<Args>{extern"rust-call"fncall(&self,args:Args)->Self::Output;}pubtraitFnMut<Args>:FnOnce<Args>{extern"rust-call"fncall...
// ffi/rust-call-c/src/main.rs// 标准库<stdlib.h>内置的abs函数extern"C"{#[link_name="abs"]fnabs_in_rust(input:i32)->i32;}fnmain(){unsafe{println!("abs(-1) is {}",abs_in_rust(-1));}} 2. 标准库 在实际开发 Rust 语言与其它语言相互调用的程序时,会遇到需要相互传递参数的情况...
extern "C" { fn c_function(arg: i32) -> i32; } fn call_c_function(arg: i32) -> i32 { unsafe { c_function(arg) } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 2.2 嵌入汇编 有时候,性能要求非常高,需要直接使用汇编指令来优化代码。Rust提供了内联汇编的功能,通过不安全函数来嵌入汇编。
// 使用不安全函数调用C语言的库函数extern"C"{fnc_function(arg:i32)->i32;}fncall_c_function(arg:i32)->i32{unsafe{c_function(arg)}} 2.2 嵌入汇编 有时候,性能要求非常高,需要直接使用汇编指令来优化代码。Rust提供了内联汇编的功能,通过不安全函数来嵌入汇编。
cargonew--bin test_rust_call_c 二、生成一个c动态库 如果了解在c里面生成动态库的流程可不看,这个使用简单的add函数(返回两个入参的和),演示流程,至于更多的类型转化可看官方文档。 1.add.h内容 #ifndef_ADD_H#ifdef__cplusplusextern"C"{#endifintadd(inta,intb);#ifdef__cplusplus"}"#endif#endif ...