gpt4 book ai didi

rust - 如何在不使用 Box 的情况下从特征方法返回匿名类型?

转载 作者:行者123 更新时间:2023-11-29 07:54:51 24 4
gpt4 key购买 nike

我有一个扩展特征,它的方法只是适配器/组合器的简写:

fn foo(self) -> ... { self.map(|i| i * 2).foo().bar() }

Trait::foo() 的返回类型是一些嵌套的 Map<Foo<Bar<Filter... ,包括闭包,因此出于所有实际目的都是匿名的。我的问题是如何从特征方法返回这样的类型,最好不使用 Box .

  • impl Trait在返回位置将是要走的路,但此功能尚未为特征方法实现。
  • 返回 Box<Trait>是可能的,但我不想为特征不足的每个适配器分配。
  • 我不能将匿名类型放入结构中并返回它,因为 struct Foo<T> { inner: T }无法实现(我保证对所有 T 实现一个实现,但只返回一个特定的 Foo<Map<Filter<Bar... )。
  • 存在类型可能会解决上述问题,但它们在一段时间内不会被实现。

我也可以避免这个问题并使用宏或独立函数;不过,这也让人感觉不卫生。

还有更多见解吗?

最佳答案

What is the correct way to return an Iterator (or any other trait)?涵盖了所有现有的解决方案。您没有使用的方法是用函数指针替换闭包,然后使用类型别名(可选择包装在新类型中)。这并不总是可能的,但由于您没有提供 MCVE您的代码,我们无法判断这是否适合您:

use std::iter;

type Thing<T> = iter::Map<iter::Filter<T, fn(&i32) -> bool>, fn(i32) -> i32>;

trait IterExt: Iterator<Item = i32> {
fn thing(self) -> Thing<Self>
where
Self: Sized + 'static,
{
// self.filter(|&v| v > 10).map(|v| v * 2)
fn a(v: &i32) -> bool { *v > 10 }
fn b(v: i32) -> i32 { v * 2 }
self.filter(a as fn(&i32) -> bool).map(b as fn(i32) -> i32)
}
}

impl<I> IterExt for I
where
I: Iterator<Item = i32>,
{}

fn main() {}

老实说,在这些情况下,我会创建一个新类型来包装盒装特征对象。这样,当可行时,我可以灵活地以 API 兼容的方式使用非盒装选项在内部重新实现它。

关于rust - 如何在不使用 Box 的情况下从特征方法返回匿名类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49980850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com