是否可以使用多个段具有尖括号参数的类型路径?

时间:2017-08-19 08:38:16

标签: rust

我正在使用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>。这真的有可能吗?也许不是类型参数,但寿命?或者只有在合并RFC后才能在不久的将来实现?

这个问题仅在类型的上下文中。

2 个答案:

答案 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');

然而,这只能起作用,因为最后一段是一个功能。但这就是我们现在所能做的一切:两个段上的参数,其中一个是函数。我们可以有以下可能的路径段:

  • 模块/包装箱
    • 可以跟随:模块,类型,功能
    • 可以使用任何通用参数
  • 类型
    • 可以跟着:type¹,function
    • 可以具有通用参数
  • 功能
    • 可以跟着: nothing
    • 可以具有通用参数

暂时忽略(¹),我们可以认为我们可以将很多类型相互嵌套,以在每个段上创建具有类型参数的任意长路径。但是(!)如果另一种类型是关联类型,则类型只能跟随另一种类型。目前,关联类型不能具有类型参数。但是,这可能是change soon

总而言之:今天,类型的路径最多只有一个带有尖括号参数的段。但这很可能在不久的将来发生变化。

答案 1 :(得分:-1)

每个细分都可以有参数:

struct Foo<T> {
    t: T,
}

impl<T> Foo<T> {
    fn bar<U>() {}
}

fn main() {
    Foo::<u8>::bar::<u32>();
}