Rust 函数数组类型中“fn”和“||”之间的差异
我在Rust中做了一些简单的实验,涉及到一系列函数,最后得出了以下工作代码: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
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