tao-of-rust-codes
tao-of-rust-codes copied to clipboard
关于`<...>`用法的补充
struct Point<T> {
x: T,
y: T
}
impl<T> Point<T> {
fn new(x: T, y: T) -> Self {
Point {x: x, y: y}
}
}
fn main(){
let p = Point::<i32>::new(2, 2);
let p: Point<i32> = <Point>::new(2, 2);
}
总结:
- <...> 可以包裹具体类型,即便在调用方法时也可以。常见用法:完全限定语法<T as trait>
- Turbofish操作符
::<>,是<...>针对泛型函数或数据类型调用的一种特例语法,增加了xxx::前缀Path - 除了Turbofish,
<....>也可以在更广泛的需要泛型实例化的地方使用
更详细的内容在 https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md
<...>叫做Type Segment
当我们写
let p = Point::<i32>::new(2, 2);
的时候,这里的 Point::<i32>::new 实际上是一个 Path ,它在当前上下文中唯一的标识了一个类型 Point<i32> 中的函数 new
而当我们写
let p: Point<i32> = <Point>::new(2, 2);
的时候,左侧的 Point<i32> 实际上是一个类型标注(或者叫类型标记?),表示右侧表达式求值结果的类型应该是一个 Point<i32>