我正在使用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>,
}
pub struct PathSegment {
pub ident: Ident,
pub parameters: PathParameters,
}
显然,在解析Rust类型后,可以在每个路径段上都有参数,例如类型的A<i32>::B<i32>
。这真的有可能吗?也许不是类型参数,但寿命?或者只有在合并RFC后才能在不久的将来实现?
这个问题仅在类型的上下文中。
答案 0 :(得分:2)
今天当然可以在多个段上使用通用参数的路径。例如,你可以这样写:
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');
然而,这只能起作用,因为最后一段是一个功能。但这就是我们现在所能做的一切:两个段上的参数,其中一个是函数。我们可以有以下可能的路径段:
暂时忽略(¹),我们可以认为我们可以将很多类型相互嵌套,以在每个段上创建具有类型参数的任意长路径。但是(!)如果另一种类型是关联类型,则类型只能跟随另一种类型。目前,关联类型不能具有类型参数。但是,这可能是change soon。
总而言之:今天,类型的路径最多只有一个带有尖括号参数的段。但这很可能在不久的将来发生变化。
答案 1 :(得分:-1)
每个细分都可以有参数:
struct Foo<T> {
t: T,
}
impl<T> Foo<T> {
fn bar<U>() {}
}
fn main() {
Foo::<u8>::bar::<u32>();
}