Расттест 1
Какой тип имеет переменная result?
fn count_uppercase(s: &str) -> usize {
let result = {
let upper = s.chars().filter(|c| c.is_uppercase()).collect::<String>();
return upper.len();
};
}
Ответ
result имеет тип ! (never type/никогдатый тип).
В result записывается результат выполнения блока инструкций в фигурных скобочках.
Блок { ... } всегда возвращает значение, но как быть, если мы натыкаемся на return,
прерывающий поток выполнения программы и возвращающий значение из функции, а не из блока?
Для этого в раст завезли служебный тип !, показывающий, что тип данной переменной никогда не будет присвоен.
Если бы мы переписали функцию следующим образом:
fn count_uppercase(s: &str) -> usize {
let result = {
let upper = s.chars().filter(|c| c.is_uppercase()).collect::<String>();
upper.len()
};
return result
}
то result бы имел верный тип usize.
P.S.: обычно в расте принято опускать return и писать вместо него возвращаемое значение без ;.
Это трактуется как возврат значения из текущего блока (в том числе функции)
Ограничен ли дженерик-тип T какими-либо трейтами?
pub fn drop<T>(_x: T) { }
Ответ
Да, по умолчанию любые дженерики имеют ограничение T: Sized.
Этот трейт реализован для всех типов, размер которых известен на момент компиляции.
Для отмены ограничения используется следующий синтаксис:
pub fn drop<T: ?Sized>(_x: T) { }
означающий, что функция может принимать безразмерные типы (DST), такие как dyn Trait, [u8], str и т.д.
Есть ли отличия между следующими кусками кода?
const GLOBAL_MUTEX: Mutex<i32> = Mutex::new(0);
и
static GLOBAL_MUTEX: Mutex<i32> = Mutex::new(0);
Ответ
const клонирует значение константы во все места её использования.
В результате вместо изменения глобального мьютекса мы получаем несколько клонированных мьютексов и часы дебага.
В случае со static программа действительно создаёт один глобальный мьютекс, который можно изменять из разных потоков.
Это известная проблема, о которой не сигнализирует rustc,
поэтому будет полезно дополнительно использовать clippy в вашем проекте. Он не только отловит неверное использование констант,
но привьёт вам чувство прекрасного растового кода.
Почитать ещё