[英]How to use Higher Rank Trait Bounds with anonymous closure in return type
[英]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.