我看过一些Rust示例中使用的关键字type
,但我从未见过它的解释。我看到它如何使用的几个例子:
impl Add<Foo> for Bar {
type Output = BarFoo;
// omitted
}
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书中找到它。
答案 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)
type
关键字rust 中的 type 关键字在两个可以使用的地方有不同的含义:
关联类型与泛型不同,因为(以下copied from docs):
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
}
}