rust 你能返回闭包或者创建像闭包一样的可调用对象吗?[副本]

zpgglvta  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(121)

此问题已在此处有答案

Returning a closure from a function(4个答案)
23天前关闭
我一直遇到一个问题例如,我有以下内容:

fn make_iterator<'a, T>(t: &'a T) -> ///???
where T: SomeTrait
{
 /* some complex logic*/
  
   return |i:usize| {
      let res = t.method(i);
      t.other_method(res)
   };
}

我正在尝试这样一个实际的例子:

pub fn iter_concentric_rings<'a>(&'a self, depth: usize)
    where
        V: Clone + Debug,
        E: Clone + Debug,
        F: Clone + Debug,
    {
        BFSIterator::new(self.id(), |depth, &id| {
            let v = unsafe { (*self.mesh).vert_handle(id) };
            v.iter_verts().map(|h| h.id())
        })
    }

在这两种情况下,目标都是构造一个闭包,该闭包使用它从更广泛的范围继承的上下文执行某些操作。它们的存在是为了方便,调用者可以简单地自己定义它们,这只是乏味和冗长。
你可以用宏来代替它们,这是可行的,但我倾向于尽可能避免使用宏。
如果结构是可调用的,你可以将功能定义为结构的方法并传递它,允许你返回一个类似于不是闭包的对象的闭包。
总的来说,我只是不知道如何使这些帮助器尽量减少定义闭包定义的常见模式的繁琐,这些模式在我的代码中被构造。

relj7zay

relj7zay1#

你可以使用impl Trait语法来返回一个闭包。

pub fn return_closure<T>(t: T) -> impl FnOnce(usize) -> T {
    move |i: usize| t
}

您可能需要返回FnOnce , FnMut , or Fn,这取决于闭包。
你的另一个例子可能看起来像这样:

pub fn iter_concentric_rings<'a>(&'a self, depth: usize)
    -> BFSIterator<impl Fn(usize, &Id) -> IterVerts + 'a>

你不能使结构体可调用,但是你可以为闭包和某些结构体创建另一个trait并实现它。

相关问题