第一段代码:
use std::any::type_name;
trait Ext: Sized {
fn test(self: &Self) {
println!("{}", type_name::<Self>())
}
}
impl<T> Ext for &T {}
fn main() {
(&String::new()).test(); // output:&alloc::string::String
}
如果把函数参数改为 self: Self 结果也一样:Self 类型是 &String。
第二段代码:
use std::any::type_name;
trait Ext: Sized {
fn test(self: &Self) {
println!("{}", type_name::<Self>())
}
}
impl<T> Ext for T {}
fn main() {
(&String::new()).test(); // output:alloc::string::String
}
与上段代码的区别是:这次是 impl for T,然后 Self 类型变成了 String;
如果把函数参数改为 self: Self 结果会变成 &String
看起来,第二段代码在Self的类型声明处发生了模式匹配:将传入的 &Self 和 &String 做匹配,得出 Self 是 String(有人也称其为“自动解引用”)
我的问题是:为什么第一段代码没有发生 模式匹配/自动解引用?因为纯泛型T是特例吗?
1
共 2 条评论, 1 页
评论区
写评论因为T可以匹配
T、&T,&mut T, 而&T只可以匹配&T参考 常见的Rust lifetime误解
把亲的代码整理一下:
运行结果: