我在一些Rust 的例子中看到了关键词type,但我从来没有看到过它的解释.以下是我看到的几个例子:

impl Add<Foo> for Bar {
    type Output = BarFoo;
    // omitted
}

这是taken from the reference:

type T = HashMap<i32,String>; // Type arguments used in a type expression
let  x = id::<i32>(10);       // Type arguments used in a call expression

谁能解释一下这个关键词的作用吗?我在《铁 rust 举例》或《铁 rust 书》中找不到它.

推荐答案

impl之外的简单type Foo = Bar;定义了type alias,是documented in The Book.有一个泛型版本type Foo<T> = ...,但如果你一般理解泛型,那么这是一个明显的扩展.

impl中的type定义了associated type.他们是documented in The Book人,但我已经写了一个简短的总结,所以你也得到了:

当你有一个像Add这样的trait 时,你不仅要抽象出什么类型的事物可以被添加,还要抽象出它们总和的类型.添加整数会生成整数,添加浮点会生成浮点.但是你不希望结果类型像Add<ThingToAdd, ResultType>中那样是一个Add的参数,原因我在这里略过.

因此,这一特征与impl相关.给定Add的任何实现,例如impl Add<Foo> for Bar,加法结果的类型已经确定.这是在特征中声明的,如下所示:

trait Add<Rhs> {
    type Result;
    // ...
}

然后所有的实现都定义了它们的结果的类型:

impl Add<Foo> for Bar {
    type Result = BarPlusFoo;
    // ...
}

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

如何从polars DataFrame中获取一个列作为Option String?<>

使用模块中的所有模块,但不包括特定模块

是否可以在不切换到下一个位置的情况下获得迭代器值:

为什么这个变量不需要是可变的?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

&'a T 是否意味着 T: 'a?

如何对一个特征的两个实现进行单元测试?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

注释闭包参数强调使用高阶排定特征界限

Rust 中的生命周期:borrow 的 mut 数据

特征中定义的类型与一般定义的类型之间的区别

如何获取函数中borrow 的切片的第一部分?

预期的整数,找到 `&{integer}`

如何将切片推入数组?

相交着色器从 SSBO 中读取零

Rust 跨同一文件夹中文件的可见性

在 Rust 中获得准确时间的正确方法?

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?