Lambda 传递和评估锈封

Lambda 传递和评估锈封,lambda,rust,Lambda,Rust,我在传递和评估闭包列表时遇到困难。经过大量简化,此程序显示出与我尝试编写的程序相同的错误: use std::vec::flat_map; #[main] fn main() { let list:~[~fn()->~[~str]] = get_list(); //let res:~[~str] = flat_map(list, |&f|{f()}); let res:~[~str] = flat_map(list, apply); println(res.to_

我在传递和评估闭包列表时遇到困难。经过大量简化,此程序显示出与我尝试编写的程序相同的错误:

use std::vec::flat_map;

#[main]
fn main() {
  let list:~[~fn()->~[~str]] = get_list();
  //let res:~[~str] = flat_map(list, |&f|{f()});
  let res:~[~str] = flat_map(list, apply);
  println(res.to_str());
}

fn apply<T>(f:&fn()->T) -> T {
  f()
}

fn get_list() -> ~[~fn()->~[~str]] {
  ~[
    ~||{~[~"foo"]},
    ~||{~[~"bar"]},
    ]
}
使用std::vec::flat_map;
#[主要]
fn main(){
let list:~[~fn()->~[~str]]=get_list();
//设res:~[~str]=flat_映射(list,|&f |{f()});
让res:~[~str]=平面图(列表,应用);
println(res.to_str());
}
fn应用(f:&fn()->T)->T{
f()
}
fn get_list()->~[~fn()->~[~str]]{
~[
~|{~[~“foo”]},
~|{~[~“bar”]},
]
}
这基本上是尝试获取返回列表的函数列表,并将其转换为运行函数的结果的平面列表。但我遇到两个编译器错误:

temp.rs:7:35: 7:40 error: mismatched types: expected `&fn<no-bounds>(&~fn:Send() -> ~[~str]) -> ~[<V3>]` but found `extern "Rust" fn(&fn<no-bounds>() -> <V4>) -> <V4>` (expected &-ptr but found fn)
temp.rs:7   let res:~[~str] = flat_map(list, apply);
                                             ^~~~~
temp.rs:16:2: 19:5 error: mismatched types: expected `~[~fn:Send() -> ~[~str]]` but found `~[~&fn<no-bounds>() -> ~[~str]]` (expected fn but found ~-ptr)
temp.rs:16   ~[
temp.rs:17     ~||{~[~"foo"]},
temp.rs:18     ~||{~[~"bar"]},
temp.rs:19     ]
error: aborting due to 2 previous errors
temp.rs:7:35:7:40错误:不匹配的类型:应为`&fn(&~fn:Send()->~[~str])->~[]`但找到了'extern“Rust”fn(&fn()->)->`(应为&-ptr但找到了fn)
温度rs:7让res:~[~str]=平面图(列表,应用);
^~~~~
temp.rs:16:2:19:5错误:不匹配的类型:应为“~[~fn:Send()->~[~str]]”但找到了“~[~&fn()->~[~str]]”(应为fn但找到了~-ptr)
临时秘书:16~[
临时秘书:17 ~| ~[~“foo”]},
温度rs:18 ~|{~[~“bar”]},
临时秘书:19]
错误:由于之前的两个错误而中止

首先,函数
apply
和我注释掉的lambda都不允许我映射函数列表。其次,在函数
get_list()
中,我无法生成一个可接受的向量。

有两个问题:一个是生锈的bug,另一个实际上是代码的问题

  • Rust中的bug是,使用闭包进行推理(目前)非常可怕,当需要
    &fn
    以外的任何东西时,必须给它们显式类型。(此文件的一份存档为。)
  • 代码中的错误是由于


    (注意,我删除了不必要的类型注释,并使用了而不是函数,因为这是Rust样式。)

    谢谢,这非常有用。您可能知道我仍然在围绕类型系统进行思考:)。
    pub fn flat_map<T, U>(v: &[T], f: &fn(t: &T) -> ~[U]) -> ~[U]
    
    fn main() {
      let list = get_list();
      let res = list.flat_map(|f| (*f)());
      println(res.to_str());
    }
    
    fn get_list() -> ~[~fn() -> ~[~str]] {
        let f1: ~fn() -> ~[~str] = || ~[~"foo"];
        let f2: ~fn() -> ~[~str] = || ~[~"bar"];
    
        ~[f1, f2]
    }