Trait :: <T>和<Trait <T >>有什么区别?

时间:2019-12-02 14:14:35

标签: generics rust

我有一个可以通过其方法访问的类型

SomeTrait::<T>::method()

但是我不明白这和

之间的区别
<SomeTrait<T>>::method()

在C ++中,我期望这样:

SomeTrait<T>::method()

这两个不同吗?他们俩似乎都在<T>上称method的{​​{1}}专长。

3 个答案:

答案 0 :(得分:4)

不能使用C ++语法,因为它在Rust中含糊不清:在SomeTrait<T>::method()中,第一个<是小于运算符,还是泛型参数列表的开头?

您所引用的两种方法可用于消除歧义:

答案 1 :(得分:2)

SomeTrait::<T>::method()<SomeTrait<T>>::method()在Rust中是同一件事。

只是样式选择。

答案 2 :(得分:2)

C ++语法不明确

解析C ++的最大挑战之一就是能否区分<是小于运算符还是模板参数列表的开头。

在大多数情况下,编译器通过“作弊”来向您隐藏复杂性,而C ++解析器执行符号查找以识别<左侧的内容是模板struct / method还是不是。

在某些情况下,这种复杂性浮出水面;在模板中,其中的符号种类不清楚,必须使用template关键字来区分:

foo.template get<T>()

Rust语法倾向于LL(1)

借助事后观察,这是Rust开发人员非常希望避免的一种黑客攻击方式。

因此,Rust中的相同表达式将显示为:foo.get::<T>()

为了保持一致,将相同的语法应用于类型Foo::<T>::method()