tao-of-rust-codes icon indicating copy to clipboard operation
tao-of-rust-codes copied to clipboard

关于`<...>`用法的补充

Open ZhangHanDong opened this issue 6 years ago • 2 comments

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);
}

总结:

  1. <...> 可以包裹具体类型,即便在调用方法时也可以。常见用法:完全限定语法<T as trait>
  2. Turbofish操作符 ::<> ,是<...>针对泛型函数或数据类型调用的一种特例语法,增加了xxx::前缀Path
  3. 除了Turbofish,<....>也可以在更广泛的需要泛型实例化的地方使用

ZhangHanDong avatar Apr 17 '19 07:04 ZhangHanDong

更详细的内容在 https://github.com/rust-lang/rfcs/blob/master/text/0132-ufcs.md

<...>叫做Type Segment

ZhangHanDong avatar May 11 '19 05:05 ZhangHanDong

当我们写

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>

mzji avatar May 14 '19 09:05 mzji