java怎么样实现反射_Rust如何实现反射?

首先,鲁斯特没有反思;反射意味着您可以在运行时获取有关类型的详细信息,例如字段,方法,它实现的接口等 . 您不能使用Rust执行此操作 . 您可以获得的最接近的是显式实现(或派生)提供此信息的特征 .

每种类型在编译时都会分配给它 TypeId . 因为具有全局排序的ID很难,所以ID是从包含的类型's definition, and assorted metadata about the crate in which it'的组合派生的整数 . 换句话说:它们只是用于定义类型的各种信息的哈希值 . [1]

impl Any for T {

fn get_type_id(&self) -> TypeId { TypeId::of::() }

}

(边界可以非正式地减少到"all types that aren't borrowed from something else" . )

您还可以找到 TypeId 的定义:

pub struct TypeId {

t: u64,

}

impl TypeId {

pub const fn of() -> TypeId {

TypeId {

t: unsafe { intrinsics::type_id::() },

}

}

}

intrinsics::type_id 是编译器识别的内部函数,在给定类型的情况下,返回其内部类型ID . 这个调用只是在编译时用文字整数类型ID替换;这里没有实际的电话 . [2]这就是 TypeId 知道类型的ID是什么 . TypeId ,然后,只是这个 u64 的包装器,以隐藏用户的实现细节 . 如果您发现它在概念上更简单,您可以将类型的 TypeId 视为编译器在编译时才知道的常量64位整数 .

Any 从 get_type_id 转发到此,意味着 get_type_id 实际上只是将特征方法绑定到适当的 TypeId::of 方法 . 它只是确保如果你有一个 Any ,你可以找到原始类型的 TypeId .

现在, Any 已针对大多数类型实现,但这并不意味着所有这些类型实际上都在内存中浮动 Any 实现 . 实际发生的是,如果有人编写需要它的代码,编译器只为类型的 Any 实现生成实际代码 . [3]换句话说,如果您从未对给定类型使用 Any 实现,则编译器将永远不会生成它 .

这就是Rust履行"do not pay for what do you not use"的方式:如果您从未将给定类型作为 &Any 或 Box 传递,则永远不会生成相关代码,也不会占用已编译二进制文件中的任何空间 .

[1]:令人沮丧的是,这意味着类型的 TypeId 可以根据库的编译方式进行更改,以便将其编译为依赖项(而不是独立构建)会导致 TypeId 更改 .

[2]:就我所知 . 我可能错了,但如果是这样的话,我会感到非常惊讶 .

[3]:这对于Rust中的泛型通常是正确的 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值