Это вещь, о которой обычно забывают: каждое замыкание - это отдельная структура, которая реализует Fn
: Fn
- это признак, а не структура, и реализации признака не транзитивны.
ЗдесьВот небольшой пример, который показывает эту точку:
trait Base {}
trait Derived {}
struct Foo {}
impl Base for Derived {}
impl Derived for Foo {}
fn myf<T>(_t: Box<T>)
where
T: Base + ?Sized,
{
}
fn main() {
let foo = Box::new(Foo {});
//myf(foo) // does not compile
myf(foo as Box<Derived>)
}
То, что вы действительно хотели сделать, это:
trait MyTrait {}
impl<T> MyTrait for T
where
T: Fn() -> &'static str,
{
}
impl<T> MyTrait for T
where
T: Fn(u8) -> u8,
{
}
fn myf<F>(_fun: Box<F>)
where
F: MyTrait,
{
}
fn main() {
myf(Box::new(|i: u8| i + 2))
}
Но это не может быть скомпилировано, потому что есть две конфликтующие реализации.