我正在使用syn
来解析 Rust 代码。查看 AST 节点的类型定义,我注意到了一些东西并产生了兴趣:是否有可能具有类型的路径(例如a::b::c
(哪里有多个段具有尖括号参数?到目前为止,我只在最后一段上看到了尖括号参数。
下面是一些 AST 节点的类型定义;Ty
:
pub enum Ty {
...
Path(Option<QSelf>, Path),
}
Path
:
pub struct Path {
pub global: bool,
pub segments: Vec<PathSegment>,
}
PathSegment
pub struct PathSegment {
pub ident: Ident,
pub parameters: PathParameters,
}
因此,显然在解析 Rust 类型后,可以在每个路径段上都有参数,例如A<i32>::B<i32>
for type。这真的可能吗?也许不是类型参数,而是生存期?还是只有在RFC合并后的近期才有可能?
这个问题仅在类型上下文中。
今天当然有可能在多个段上有一个带有通用参数的路径。例如,你可以这样写:
struct Foo<T> {
_dummy: T,
}
impl<T> Foo<T> {
fn bar<U>() {}
}
// So many parameters!
Foo::<u32>::bar::<char>();
另一个来自标准库Option
的示例:
Option::<u32>::ok_or::<char>(None, 'a');
但是,这仅有效,因为最后一个段是一个函数。但这就是我们现在所能做的:两个段上的参数,其中一个是函数。我们可以有以下可能的路径段:
模块- /板条箱
- 可以跟随:模块、类型、功能
- 不能有任何泛型参数
类型后 - 跟:类型¹,函数
- 可以有泛型参数
- 函数
- 可以遵循:无
- 可以有泛型参数
暂时忽略 (¹(,人们可能会认为我们可以将许多类型相互嵌套,以在每个段上使用类型参数创建任意长的路径。但是 (!( 一个类型后面只能跟另一个类型,如果这个其他类型是关联类型。现在,关联的类型不能具有类型参数。但是,这可能很快就会改变。
总而言之:今天,类型的路径最多有一个带有尖括号参数的段。但这很可能在不久的将来发生变化。
每个段已经可以有参数:
struct Foo<T> {
t: T,
}
impl<T> Foo<T> {
fn bar<U>() {}
}
fn main() {
Foo::<u8>::bar::<u32>();
}