具有相同参数和结果类型的两个
TypeId
类型的 fn
在非泛型函数与使用相同类型实例化的泛型函数中采用 TypeId
时有所不同:
在此 rust 程序(permalink)中,虽然为
TypeId
(第 4 行)和 Option<&dyn I>
(第 12 行)打印相同的 Option<&T>
,但当类型包装为 fn
类型时,打印的TypeId
不同(第 5 行和第 13 行)。
use std::any::TypeId;
fn main() {
dbg!(TypeId::of::<&dyn I>());
dbg!(TypeId::of::<fn(&dyn I)>());
f::<dyn I>();
}
trait I {}
pub fn f<T: ?Sized + 'static>() {
dbg!(TypeId::of::<&T>());
dbg!(TypeId::of::<fn(&T)>());
}
我的目标是能够将
fn
指针存储在 Any
对象中,以便我稍后可以向下转换它们。但这不起作用(大概是因为 TypeId
不匹配)。
问题是生命周期,
fn(&T)
是fn<'a>(&'a T)
的简写,不幸的是与裸露的&T
不同,对于'static
'static
项目,生命周期不限于fn
。也就是说 &T: 'static
需要 &'static T
,而 fn(&T): 'static
不需要。现在要获得具体类型,编译器必须插入 'a
的生命周期,并且这些生命周期在不同的上下文中有所不同。
这可能与 #84366 有关,因此也可能是编译器错误。
您可以通过使用没有生命周期作为参数的类型来解决这个问题:
fn(Box<T>)
或将该生命周期限制为'static
:fn(&'static T)
您也可以将其限制为相同的通用生命周期'a
当你在某处有这样的生命周期参数时。