~str) -> ~str { func() } -6ren">
gpt4 book ai didi

rust - 如何制作一个类型为 'extern "C"fn' 的闭包

转载 作者:行者123 更新时间:2023-11-29 08:06:58 25 4
gpt4 key购买 nike

这是关于这个问题的简短示例。

#[fixed_stack_segment]
fn test(func: extern "C" fn() -> ~str) -> ~str {
func()
}
extern "C" fn func1() -> ~str {
~"hello"
}

fn main() {
let func2 = || -> ~str { ~"world" };
println(test(func1));
println(test(func2));
}

然后,rustc 因错误而停止。

st.rs:13:17: 13:22 error: mismatched types: expected `extern "C" fn() -> ~str` but found `&fn<no-bounds>() -> ~str` (expected extern fn but found fn)
st.rs:13 println(test(func2));

我找不到使 lambda 成为外部 fn 的方法。

我该怎么办?

最佳答案

闭包语法总是&fn~fn,并创建一个extern "ABI"fn(对于ABI,包括Rust),需要使用完整的函数声明。

#[fixed_stack_segment]
fn test(func: extern "C" fn() -> ~str) -> ~str {
func()
}
extern "C" fn func1() -> ~str {
~"hello"
}

fn main() {
extern "C" fn func2() -> ~str { ~"world" }

println(test(func1));
println(test(func2));
}

有人谈论允许 lambda 也创建非闭包,ABI 像类型签名中的任何其他东西一样推断,但这尚未实现。


但是,正如 Vladimir Matveev 所说,闭包和普通函数之间存在根本区别,这意味着当作为 extern fn 传递时,永远无法使用闭包的所有功能。不同之处在于闭包可以捕获(引用)变量,即

let n = 1;
let f = || { n + 1 };

这意味着闭包有效地表示为

struct AndFn { // &fn
env: &Environment,
func: extern "Rust" fn()
}

struct TwiddleFn { // ~fn
env: ~Environment,
func: extern "Rust" fn()
}

其中 Environment 是一个包含该闭包的所有捕获变量的结构(每个 &fn 都不同,因为每个捕获不同的东西); func 是指向闭包代码的函数指针,它是调用闭包时执行的代码;如果闭包捕获任何变量,func 将要求 env 存在。因此,当 lambda 语法不捕获任何变量时,它只能创建普通的 extern fn

关于rust - 如何制作一个类型为 'extern "C"fn' 的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387003/

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