什么是Rust类型关键字?

时间:2015-04-04 15:05:54

标签: rust

我看过一些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 by Example或Rust书中找到它。

2 个答案:

答案 0 :(得分:21)

type Foo = Bar;之外的简单impl定义了类别别名,并且是documented in The Book。这是一个通用版本type Foo<T> = ...,但如果你理解泛型,那么这是一个明显的扩展。

type中的

impl定义关联类型。他们是documented in The Book,但我已经写了一个简短的摘要,所以你也得到了:

当你有像Add这样的特征时,你不仅要抽象可以添加什么类型的东西,还要抽象它们的总和类型。添加整数会产生整数,添加浮点会导致浮点数。但是,您不希望结果类型与Add中的Add<ThingToAdd, ResultType>的参数一样,原因是我会在这里略过。

因此,该特征带有与impl相关联的类型。给定Add的任何实现,例如impl Add<Foo> for Bar,已经确定了相加结果的类型。这是在这样的特征中声明的:

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

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

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

答案 1 :(得分:0)

Rust type 关键字

rust 中的 type 关键字在两个可以使用的地方有不同的含义:

  1. 类型别名:相同类型的另一个名称。
  2. 关联类型:这发生在 trait 和 trait impl 块中。关联类型用于定义使用某些类型的特征,而无需在实现特征之前确切知道这些类型是什么。

关联类型与泛型不同,因为(以下copied from docs):

  • 当一个 trait 有一个泛型参数时,它可以为一个类型多次实现,每次改变泛型类型参数的具体类型。
  • 对于关联类型,我们不需要对类型进行注解,因为我们无法在一个类型上多次实现一个 trait

示例:

fn main() {
    // Type alias, Nr is an alias for u32
    type Nr = u32;
    let number: Nr = 34;

    let test = Test { nr: 9 };
    println!(" {} ", test.add_one()); // prints 10
}

struct Test {
    nr: i32,
}

pub trait Hi {
    // Associated type
    type Item;

    fn add_one(&self) -> Self::Item;
}

impl Hi for Test {
    // Associated type Item will be type i64
    type Item = i64;

    fn add_one(&self) -> Self::Item {
        (self.nr + 1) as i64
    }
}