为何未实现Colorize trait的String类型可调用Colorize的方法
问题解答
为什么String能调用Colorize的方法?
这是 Rust 方法调用时的自动引用/解引用 + Deref 强制转换机制导致的,满足两个前提:
String实现了Deref<Target = str>特征,任意&String类型可以在编译期被自动转换为&str类型Colorize特征为&str类型实现了所有颜色方法,blue方法的接收者self类型本身就是&str
Rust 调用方法时会自动对接收者尝试加引用、减引用、Deref 转换,直到匹配到方法要求的接收者类型,不需要开发者手动做类型转换。
调用过程脱糖&运行逻辑
你示例中的代码:
let blue = "blue".to_owned().blue();
会被编译器自动脱糖为等价代码:
let blue = Colorize::blue(&*"blue".to_owned());
具体执行步骤:
- 第一步:
"blue".to_owned()生成一个String类型的临时值 - 第二步:编译器优先查找
String类型本身的blue方法,未找到 - 第三步:依次查找
&String、&mut String类型的blue方法,均未找到 - 第四步:对
String做解引用得到str类型,查找str的blue方法,未找到 - 第五步:查找
&str类型的blue方法,匹配到Colorize特征的实现 - 第六步:编译器自动插入转换逻辑:先对
String临时值取引用得到&String,再通过Deref转换为&str传入方法,完成调用
底层运行原理
整个转换过程完全是编译期行为,没有任何运行时开销:
Deref特征的deref方法只是返回了String内部存储字符串切片的指针,没有内存拷贝- 所有类型匹配逻辑在编译阶段就已经完成,运行时直接执行对应方法即可
内容的提问来源于stack exchange,提问作者Izana
相关产品推荐
相关产品推荐

