使用 "mapping" 闭包实现一个函数

Implement a function with a "mapping" closure

我有一个向量 my_vec: Vec<MyStruct>,我想编写一个可以像这样调用的函数:

let strings = my_func(&my_vec, |o| o.some_string);
let numbers = my_func(&my_vec, |o| o.foo + 5);

所以基本上我需要将一个引用传递给向量和一个闭包 f 我需要函数来调用向量上的 .map(f) 加上一些其他东西和 return与闭包中 returned 具有相同类型的值的新向量。

你想做这样的事情吗?

struct MyStruct {
    o: i32
}

fn my_func<T, F>(_v: &Vec<MyStruct>, f: F) -> T
    where F: FnOnce() -> T
{
    f()
}

fn main() {
    let i = vec!(MyStruct{o:3}, MyStruct{o:4} );
    let strings = my_func(&i, || "a string");
    let numbers = my_func(&i, || 5);
    
    println!("{} {}", strings, numbers);
}

根据您的意见,您可以这样做

struct MyStruct {
    o: i32,
}

fn my_func<T, F>(v: &[MyStruct], f: F) -> Vec<T>
where
    F: FnMut(&MyStruct) -> T,
{
    v.iter().map(f).collect()
}

fn main() {
    let i = vec![MyStruct { o: 3 }, MyStruct { o: 4 }];

    let strings = my_func(&i, |o| o.o + 5);
    let numbers = my_func(&i, |o| format!("{} string", o.o));

    println!("{:?} {:?}", strings, numbers);
}