即使参数和结果具有相同类型,`fn` 的`TypeId` 也是不同的

问题描述 投票:0回答:1

具有相同参数和结果类型的两个

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
不匹配)。

function pointers generics rust
1个回答
0
投票

问题是生命周期,

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
当你在某处有这样的生命周期参数时。

© www.soinside.com 2019 - 2024. All rights reserved.