当前位置:嗨网首页>书籍在线阅读

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,ParseError>,这很麻烦。如果我们可以用更简单的名称来引用这些类型又会如何呢?这是别名大显身手的时候。它们让我们能够为具有复杂类型签名的类型提供一个名称(通常更简单)。

因此,我们可以为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类型别名那样。

介绍完一些类型系统的一些细节,接下来让我们看看字符串。