2015-06-03 1 views
4

Этот код:отсутствует срок службы спецификатор [E0106] по типу псевдонима

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. 

У меня трудно найти что-нибудь, что объясняет то, что срок службы спецификатор и почему мне это нужно в объявлении псевдонимов типа.

+0

uhm ... вы правы в том, что «находите что-нибудь, что объясняет ...»: https://doc.rust-lang.org/error-index.html#E0106 еще не существует, книга не содержит слово «спецификатор» в [главе жизни] (https://doc.rust-lang.org/nightly/book/lifetimes.html) ... связанный вопрос SO: http: // stackoverflow. ОК/questions/27097710/error-missing-lifetime-specifier-e0106 –

ответ

8

Короткий ответ

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

Ржавчина всегда четко о общих аргументов. Жизненные времена также являются общими аргументами. Представьте, что вы были бы родовыми по типу Tile.

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

Это вызовет ошибку о T не существует (за исключением, если вы определили фактический тип по имени T). Но вы бы хотели использовать Board для любого внутреннего типа. Так что вам нужно сделать, это добавить общий аргумент определения:

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

Поэтому, когда вы используете псевдоним Board типа, вы также должны пройти T типа.

Назад к нашей проблеме с продолжительностью жизни. Наш псевдоним типа имеет ссылку. Мы не знаем, какова продолжительность жизни этой ссылки. Причина, по которой вам редко приходится указывать продолжительность жизни, - lifetime-elision. Это один из случаев, когда вам нужно указать срок службы, так как вы хотите, чтобы срок жизни определялся во всех местах, где вы используете Board, как будто вы использовали &[[Tile; 19]; 19] всюду напрямую. При определении псевдонима типа единственное доступное время жизни - 'static, поэтому нам нужно определить новый общий.

+0

ОК, поэтому я думаю, что основная проблема с моим кодом заключается в том, что я действительно хотел определить значение (а не ссылку), а затем создать ссылки на это значение позже , который, кажется, сработал: 'type Board = [[Tile; 19]; 19], 'компилируется правильно. Затем я могу «разрешить доску: & Board = & [[Tile :: Empty; 19]; 19], позже. – mavix

+1

Однако я не уверен, что понимаю жизнь, даже после прочтения документации, к которой вы привязались. В нем четко объясняется синтаксис для наименования жизней вещей в функциях, но я не понимаю, что дает ему имя. Например, если я объявляю «тип Board <'a> = & 'a [[Tile; 19]; 19]; 'на верхнем уровне, где заканчивается? Кроме того, почему компилятор не предоставил мою исходную строку '' static' по умолчанию? – mavix

Смежные вопросы