Rust 如何使闭包类型为';“外部”;";fn';
这是关于这个问题的简短例子Rust 如何使闭包类型为';“外部”;";fn';,rust,Rust,这是关于这个问题的简短例子 #[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(
#[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));
st.rs:13:17:13:22错误:类型不匹配:应为'extern“C”fn()->~str`但找到了'&fn()->~str`(应为extern fn但找到了fn)
st.rs:13打印LN(测试(功能2));
我找不到一个办法让lambda成为一个外人
我该怎么办?闭包语法总是
&fn
或~fn
,要创建外部“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));
}
有人说,允许lambdas也创建非闭包,并像类型签名中的任何其他内容一样推断出ABI,但这尚未实现
然而,正如Vladimir Matveev所说,闭包和普通函数之间有一个根本的区别,这意味着当作为
外部函数传递时,将永远无法使用闭包的所有特性。不同之处在于闭包可以捕获(引用)变量,即
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
s。我认为您不能,因为闭包意味着捕获的环境,而extern函数没有任何环境。但是我不确定,让我们等待更权威的答案。嗯,我尝试使用并想要包装JSFunctionSpec(它需要'extern“C”fn')。非常感谢。我要另找一条路。