Rust中`#[lang = "..."]`属性作用是什么?与原始类型`str`有何关联?
用户问题
我正在阅读Rust 1.56.0版本标准库中core/str/mod.rs的代码,对应代码片段如下:
#[lang = "str"] #[cfg(not(test))] impl str { ...
我目前找不到lang属性的相关参考,请问该属性是否和声明原始类型str的结构有关?如果有关的话,在哪里可以查阅到处理str内部结构的相关信息?
解答
1. #[lang = "str"]属性的本质
#[lang]是Rust编译器预留的语言内置项标记属性,作用是给编译器标注核心库中和语言原生特性绑定的实现代码,普通用户代码不允许直接使用该属性,除非开启不稳定的lang_items特性。
你看到的#[lang = "str"]确实和原生str类型的处理强相关:它的作用是明确告知编译器,下方的impl块是原生str类型的官方内置方法实现,编译器会对这个块的代码做特殊绑定处理,我们日常调用的所有str自带方法,基本都定义在这个标记的impl块中。
2. 和str类型结构声明的关联
它本身并不是str类型的结构声明:str是Rust内置的动态大小原始类型,其内存布局(由指向UTF-8字节序列的指针、序列长度组成的胖指针)是在编译器内部硬编码定义的,不需要在标准库中显式声明结构体。#[lang = "str"]只是起到将标准库中的方法实现和编译器内置的str类型做绑定的作用。
3. 查阅str内部结构处理信息的渠道
- 如果你要了解
str对外暴露的方法实现,直接阅读你当前查看的core/str/mod.rs文件即可,所有str的公开方法、内部工具方法都在该文件中定义。 - 如果你要了解编译器侧对
str类型的底层布局、类型检查逻辑,可以查看Rust编译器源码中类型系统相关的模块,所有原生类型的结构规则都在编译器内部代码中定义。 - 你可以查阅Rust官方参考文档的Lang Items章节,了解所有内置
lang属性标记的作用和对应实现位置。
内容的提问来源于stack exchange,提问作者Paul Parker
相关产品推荐
相关产品推荐

