Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 函数数组类型中“fn”和“||”之间的差异_Rust - Fatal编程技术网

Rust 函数数组类型中“fn”和“||”之间的差异

Rust 函数数组类型中“fn”和“||”之间的差异,rust,Rust,我在Rust中做了一些简单的实验,涉及到一系列函数,最后得出了以下工作代码: fn fun1(参数:&String)->String{ let prefix=String::from_str(“a:”); 前缀.add(arg) } fn fun2(参数:&String)->String{ 让prefix=String::from_str(“b:”); 前缀.add(arg) } fn doall(参数:&String,函数:&fn(&String)->String]){ 对于函数中的f_vec

我在Rust中做了一些简单的实验,涉及到一系列函数,最后得出了以下工作代码:

fn fun1(参数:&String)->String{
let prefix=String::from_str(“a:”);
前缀.add(arg)
}
fn fun2(参数:&String)->String{
让prefix=String::from_str(“b:”);
前缀.add(arg)
}
fn doall(参数:&String,函数:&fn(&String)->String]){
对于函数中的f_vec.iter(){
println!({},(*f)(arg));
}
}
静态函数:&'static[fn(&String)->String]=&[fun1,fun2];
fn main(){
doall(&String::from_str(“foo”),funcs);
}
其中打印:

a: foo
b: foo
然后,在阅读中,我看到了语法
|&String |->String
,它应该也能工作,但我试着这样做:

fn doall(arg: &String, funcs_vec: &[|&String| -> String]) {
    for f in funcs_vec.iter() {
        println!("{}", (*f)(arg));
    }
}

static funcs: &'static [|&String| -> String] = &[fun1, fun2];
编译器投诉:

funcarray.rs:17:25: 17:45 error: missing lifetime specifier
funcarray.rs:17 static funcs: &'static [|& String| -> String] = &[fun1, fun2];
                                        ^~~~~~~~~~~~~~~~~~~~
如果我尝试将行更改为:

static funcs: &'static [|&String|: 'static -> String] = &[fun1, fun2];
它给了我这个错误:

funcarray.rs:17:57: 17:70 error: mismatched types:
    expected `&'static ['static |&collections::string::String| -> collections::string::String:'static]`
    but found `&'static [fn(&collections::string::String) -> collections::string::String]`
(expected fn but found extern fn)
funcarray.rs:17 static funcs: &'static [|&String|: 'static -> String] = &[fun1, fun2];
                                                                        ^~~~~~~~~~~~~
在这里我很迷路。我能做些什么使它工作(如果可能的话)


更一般地说,这两种语法在指定数组中函数的类型方面有什么区别?它似乎涉及生命周期,但我无法理解。

函数指针和闭包在锈蚀方面是完全不同的

列表

作为具有可变环境的
闭包
裸函数类型

闭包捕获其环境,而函数不捕获

闭包不能在调用堆栈中向上传递,因为无法指定/验证捕获的环境的生存期,函数不会捕获任何内容,因此可以返回

我们还没有(已经讨论过)编写非捕获闭包的简短语法,即匿名函数

正如你所看到的,这两种语言在语义和句法上有很大的区别,它们是不可互换的


有关Rust中的闭包和函数的有趣博客文章有和。

Nitpick:函数可以用来代替闭包,但不能反过来
fn两次(f:| |){(f)(;(f)()}
可以接受具有兼容签名的函数和闭包。@a.B.是的,这就是促使我尝试构建闭包数组来存储函数的原因……是否可以返回移动闭包,因为他们拥有并摧毁了捕获的资源?@Kapichu:我写这个答案时,我不认为移动闭包是一件事我知道,但现在是:)
|T…| -> U
fn(T…) -> U