簡體   English   中英

如何在不使用Box的情況下從特征方法返回匿名類型?

[英]How to return an anonymous type from a trait method without using Box?

我有一個擴展特征,其方法只是適配器/組合器的簡寫:

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的impl,但只返回一個特定的Foo<Map<Filter<Bar... )。
  • 存在類型可能會解決上述問題,但它們將在一段時間內不會實現。

我也可以避免這個問題並使用宏或獨立功能; 不過,這也感覺不衛生。

更多見解?

返回迭代器(或任何其他特征)的正確方法是什么? 涵蓋所有現有的解決方案。 你沒有使用的那個是用函數指針替換閉包然后使用類型別名(可選地換行換成新類型)。 這並不總是可行,但由於您沒有提供代碼的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兼容的方式在內部重新實現它,當它變得切實可行時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM