Класс 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
Короткий ответ:
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
, поэтому нам нужно определить новый общий.
type Board = [[Tile; 19]; 19];
правильно компилируется. Затем я смогуlet board:&Board = &[[Tile::Empty; 19]; 19];
позже. – mavix 3 June 2015 в 19:13type Board<'a> = &'a [[Tile; 19]; 19];
на верхнем уровне, где заканчивается'a
? Кроме того, почему компилятор не дает мою исходную строку'static
по умолчанию? – mavix 3 June 2015 в 19:18