08-类型别名
7.1.6 类型别名
类型别名并非Rust独有的特性。C语言具有typedef关键字,而Kotlin也具有类似的关键字typealias。它们使你的代码更具可读性,并能够移除在静态类型语言中堆积的类型签名。例如,如果你从软件包上返回Result类型的API,则会包装一个复杂对象,如下所示:
// type_alias.rs
pub struct ParsedPayload<T> {
inner: T
}
pub struct ParseError<E> {
inner: E
}
pub fn parse_payload<T, E>(stream: &[u8]) -> Result<ParsedPayload<T>,
ParseError<E>> {
unimplemented!();
}
fn main() {
// todo
}
如你所见,对于某些方法(例如parse_payload),类型签名太长而无法放入一行。此外,每次使用时必须输入Result<ParsedPayload
因此,我们可以为parse_payload的返回类型提供别名,如下所示:
// 添加一个类型别名
type ParserResult<T, E> = Result<ParsedPayload<T>, ParseError<E>>;
// 并将parse_payload方法修改为:
pub fn parse_payload<T, E>(stream: &[u8]) -> ParserResult<T, E> {
unimplemented!();
}
如果我们以后想要更改实际的内部类型,那么这种做法管理起来更方便。我们还可以在任何简单类型中输入别名:
type MyString = String;
所以现在我们可以在任何使用String的地方使用MyString。但这并不意味着MyString属于不同类型。在编译期,这只会被替换/扩展为原始类型。当为泛型创建类型别名时,类型别名还需要泛型参数(T)。因此为Vec<Result<Option
type SomethingComplex<T> = Vec<Result<Option<T>>>;
假定你的类型包含生命周期,例如SuperComplexParser<'a>:
struct SuperComplexParser<'s> {
stream: &'a [u8]
}
type Parser<'s> = SuperComplexParser<'s>;
为它们创建类型别名时,我们也要指定生命周期,就像Parser类型别名那样。
介绍完一些类型系统的一些细节,接下来让我们看看字符串。