【问题标题】:Implement a function with a "mapping" closure用“映射”闭包实现一个函数
【发布时间】:2021-11-21 04:33:12
【问题描述】:

我有一个向量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) 的函数加上其他一些东西,并返回一个与一个在闭包中返回。

【问题讨论】:

  • 函数应该返回什么?
  • Netwave,我已经在问题中解释了这一点:“并返回一个新的值向量,其类型与闭包中返回的值相同”。所以,它应该是通用的。例如,如果传递的闭包返回i64my_func 应该返回Vec<i64>
  • 我建议看看documentation of Iterator::map() 并为你的闭包参数使用相同的特征边界,即fn my_func<B, F>(v: Vec<MyStruct>, f: F) -> Vec<B> where F: FnMut(MyStruct) -> B

标签: rust closures


【解决方案1】:

你想做这样的事吗?

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);
}

【讨论】:

  • 不完全。请参阅我上面的评论。 my_func 需要返回 Vec&lt;T&gt; 并且它的实现应该类似于 _v.iter().map(f).collect() (不会编译,但你明白了)。
  • @at54321,我的更新对你有更多帮助吗?
  • 是的,Zeppi。现在它做了我需要的。谢谢! +1
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多