ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.19k stars 172 forks source link

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

Open ZhangHanDong opened 5 years ago

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

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

<...>叫做Type Segment

mzji commented 5 years ago

当我们写

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>