Как создать псевдоним типа для функции, возвращающей структуру с двумя сроками жизни? [Дубликат]

Класс SimpleNamespace может использоваться для создания новых атрибутов с помощью setattr или подкласса SimpleNamespace и создания вашей собственной функции для добавления новых имен атрибутов (переменных).

from types import SimpleNamespace variables = {"b":"B","c":"C"} a = SimpleNamespace(**v) setattr(a,"g","G") a.g = "G+" something = a.a
5
задан oli_obk - ker 3 June 2015 в 05:38
поделиться

1 ответ

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

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, поэтому нам нужно определить новый общий.

8
ответ дан oli_obk - ker 22 August 2018 в 05:24
поделиться
  • 1
    Хорошо, поэтому я думаю, что основная проблема с моим кодом заключается в том, что я действительно хотел определить значение (а не ссылку), а затем создать ссылки на это значение позже, что, похоже, сработало: type Board = [[Tile; 19]; 19]; правильно компилируется. Затем я смогу let board:&Board = &[[Tile::Empty; 19]; 19]; позже. – mavix 3 June 2015 в 19:13
  • 2
    Тем не менее, я не уверен, что понимаю жизнь, даже после прочтения документации, с которой вы связаны. В нем четко объясняется синтаксис для наименования жизней вещей в функциях, но я не понимаю, что дает ему имя. Например, если я объявляю type Board<'a> = &'a [[Tile; 19]; 19]; на верхнем уровне, где заканчивается 'a? Кроме того, почему компилятор не дает мою исходную строку 'static по умолчанию? – mavix 3 June 2015 в 19:18
Другие вопросы по тегам:

Похожие вопросы: