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

  • 本文关键字:参数 类型 路径 段具 是否 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>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>();
}

相关内容

最新更新