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')。非常感谢。我要另找一条路。