第一段代码:
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误解
把亲的代码整理一下:
运行结果: