我有一个可以通过其方法访问的类型
SomeTrait::<T>::method()
但是我不明白这和
之间的区别<SomeTrait<T>>::method()
在C ++中,我期望这样:
SomeTrait<T>::method()
这两个不同吗?他们俩似乎都在<T>
上称method
的{{1}}专长。
答案 0 :(得分:4)
不能使用C ++语法,因为它在Rust中含糊不清:在SomeTrait<T>::method()
中,第一个<
是小于运算符,还是泛型参数列表的开头?>
您所引用的两种方法可用于消除歧义:
<SomeTrait<T>>
被称为fully qualified syntax SomeTrait::<T>
被称为turbfish符号(非官方名称)。答案 1 :(得分:2)
SomeTrait::<T>::method()
和<SomeTrait<T>>::method()
在Rust中是同一件事。
只是样式选择。
答案 2 :(得分:2)
解析C ++的最大挑战之一就是能否区分<
是小于运算符还是模板参数列表的开头。
在大多数情况下,编译器通过“作弊”来向您隐藏复杂性,而C ++解析器执行符号查找以识别<
左侧的内容是模板struct / method还是不是。
在某些情况下,这种复杂性浮出水面;在模板中,其中的符号种类不清楚,必须使用template
关键字来区分:
foo.template get<T>()
借助事后观察,这是Rust开发人员非常希望避免的一种黑客攻击方式。
因此,Rust中的相同表达式将显示为:foo.get::<T>()
。
为了保持一致,将相同的语法应用于类型Foo::<T>::method()
。