我希望我的函数可以接受一个闭包作为参数,该闭包以PartialOrd
(或任何其他特性,这只是一个示例)作为参数,我希望能够在我的函数中使用任何实现了PartialOrd
的类型来调用该闭包。类似于这样:
fn my_func(cmp: fn(impl PartialOrd, impl PartialOrd) -> bool) {
cmp(3, 5);
}
当然,这并不起作用,因为impl Trait
在闭包签名中无效。(我不知道为什么,但我猜它还没有实现。)所以我尝试了类似于以下的东西:
fn my_func<T: PartialOrd>(cmp: fn(T, T) -> bool) {
cmp(3, 5);
}
这段代码无法编译,可能是因为
T
由调用方确定,而我只传递了i32
,这可能与调用方的意图不符。那么,我该怎么做呢?我的主要目的是实现以下功能:fn my_func(cmp: fn(impl PartialOrd, impl PartialOrd) -> bool) {
if some_condition {
cmp(type1_instance, type1_instance_2);
} else {
cmp(type2_instance, type2_instance_2);
}
}
type1
和type2
都实现了PartialEq
。
为了更具体,我将使用chrono
库,并想写出类似以下的代码:
fn compare_dates(d1: DateTime, d2: DateTime, cmp: fn(impl PartialOrd, impl PartialOrd) -> bool) -> bool {
if some_condition {
cmp(d1, d2)
} else {
cmp(d1.date(), d2.date())
}
}
compare_dates(
Utc.date(2000 10, 11).and_hour(0,0,0),
Utc.date(2000 10, 12).and_hour(0,0,0),
PartialOrd::lt)
注意:`DateTime::date()` 方法返回的不是 `DateTime` 类型,而是另一种名为 `Date` 的类型。
i32
时,为什么要使用一个通用类型参数呢?你有点在尝试做与类型参数的本意相反的事情。my_func
函数并不决定T
将会是什么,而是由调用者决定。 - vallentini32
,我在底部描述了我的真正问题,以免陷入 XY 问题。该参数可能是实现给定 trait 的两种不同类型之一。根据条件,我想要调用闭包并传递type1
或type2
实例之一。 - isamerttype*_instance*
,但在那个例子中它们是哪些类型?我说这是 XY 问题,因为你没有给出一个具体的例子来说明背景和情况。 - vallentincmp
只会是一个通用类型。所以当最终调用compare_dates
时,T
将会是一个具体类型。你可能可以用Any
来做一些疯狂的事情来实现这个。然而,那样的话,你可能就不能简单地使用compare_dates(..., PartialOrd::lt)
了。最简单的方法很可能是有两个cmp
函数。你有没有一个例子能说明cmp
除了小于号之外还能做更多的事情? - vallentin