类型别名上缺少生命周期说明符[E0106]

时间:2015-06-03 03:45:53

标签: rust lifetime type-alias

此代码:

use std::fmt;
use std::result::Result::{self, Ok, Err};

#[derive(Clone)]
#[derive(Copy)]
enum Tile {
    White,
    Black,
    Empty
}
type Board = &[[Tile; 19]; 19];

产生此错误:

Compiling go v0.1.0 (file:///home/max/gits/go_rusty)
src/main.rs:12:14: 12:31 error: missing lifetime specifier [E0106]
src/main.rs:12 type Board = &[[Tile; 19]; 19];
                            ^~~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `go`.

To learn more, run the command again with --verbose.

我很难找到任何解释生命周期说明符的内容以及为什么我需要在类型别名声明中使用它。

1 个答案:

答案 0 :(得分:9)

简短的回答是

type Board<'a> = &'a [[Tile; 19]; 19];

Rust总是明确关于泛型参数。生命周期也是一般参数。想象一下,你在Tile类型上是通用的。

type Board = &[[T; 19]; 19];

这会导致T不存在的错误(除非您定义了名为T的实际类型)。但是您希望能够将Board用于任何内部类型。所以你需要做的是在定义中添加一个泛型参数:

type Board<T> = &[[T; 19]; 19];

因此,每当您使用Board类别别名时,您还需要传递T类型。

回到我们的终身问题。我们的类型别名有一个参考。我们不知道这个引用的生命周期是什么。您很少需要指定生命周期的原因是lifetime-elision。这是您需要指定生命周期的情况之一,因为您希望在使用Board的所有位置确定生命周期,就像您直接在任何地方使用&[[Tile; 19]; 19]一样。在类型别名定义中,唯一可用的生命周期是'static,因此我们需要定义一个新的通用生命周期。