Программирование на Rust 5. Closures. Metaprogramming

preview_player
Показать описание

Дата лекции: 05.04.2022
Лектор: Александр Становой

00:00:00 План лекции
00:01:07 Closures
00:04:10 Closures and traits
00:15:12 Fn, FnMut, FnOnce
00:22:17 fn
00:24:37 Closures: capturing
00:34:17 Closure type
00:35:43 Closures and optimizations
00:37:09 Lambdas and C++
00:39:42 Metaprogramming
00:44:27 C++ and metaprogramming
00:46:42 Rust and metaprogramming
00:49:07 Declarative macros
00:50:37 macro_rules!
01:15:34 cargo-expand
01:18:31 Macros hygiene
01:22:26 Macros visibility
01:23:55 Procedural macros
01:31:17 Procedural macros hygiene
01:31:38 TokenStream
01:36:38 Spacing
01:37:53 syn crate
01:44:54 quote crate
01:45:43 Span
01:52:13 compile_error!
01:58:17 Macros from standard library
02:01:37 Confitional compilation
02:06:33 stringify!
02:07:32 include_str! and include_bytes!
02:08:36 Attributes
02:13:29 Conclusion

Съёмка: Данила Манаков
Монтаж: Александр Пронякин
Рекомендации по теме
Комментарии
Автор

00:00:00 План лекции
00:01:07 Closures
00:04:10 Closures and traits
00:15:12 Fn, FnMut, FnOnce
00:22:17 fn
00:24:37 Closures: capturing
00:34:17 Closure type
00:35:43 Closures and optimizations
00:37:09 Lambdas and C++
00:39:42 Metaprogramming
00:44:27 C++ and metaprogramming
00:46:42 Rust and metaprogramming
00:49:07 Declarative macros
00:50:37 macro_rules!
01:15:34 cargo-expand
01:18:31 Macros hygiene
01:22:26 Macros visibility
01:23:55 Procedural macros
01:31:17 Procedural macros hygiene
01:31:38 TokenStream
01:36:38 Spacing
01:37:53 syn crate
01:44:54 quote crate
01:45:43 Span
01:52:13 compile_error!
01:58:17 Macros from standard library
02:01:37 Confitional compilation
02:06:33 stringify!
02:07:32 include_str! and include_bytes!
02:08:36 Attributes
02:13:29 Conclusion

lectory_fpmi
Автор

1:23:03
В более новой версии не обязательно использовать macro_export для видимости за пределами модуля. Можно использовать pub таким образом:
mod a {
macro_rules! lol {
() => { "lol" }
}

pub(crate) use lol;
}

fn main() {
let _ = a::lol!();
}

macro_export понадовится чтобы использовать макрос за пределами текущего крейта

nanoqsh
Автор

12:57
Вот для этого type у трейтов и нужен, чтобы каждый раз не указывать явно тип в параметрах. Этот пример можно переписать проще:
fn map<X, T>(option: Option<X>, transform: T) -> Option<T::Output>
where T: Transform<X>

nanoqsh
Автор

31:54 на самом деле компилятор даже раньше возвращает ошибку и в месте определении самой функции будет: closure may outlive the current function, but it borrows `x`, which is owned by the current function rustc may outlive borrowed value `x`

fourbytes
Автор

27:24 ошибка в объявлении Environment, там ещё должен быть дженерик T указан, а иначе не скомпилируется.
struct Environment<'x, 'y, T> {
x: &'x T,
y: &'y mut T,
z: T,
}

fourbytes
Автор

35:40 что-то всё равно не понял аргумент в пользу того, что это разные лямбды в Vec поэтому это не должно компилироваться, но сейчас в 1.76.0 это компилируется без ошибок.

fourbytes
Автор

34:00 никто не скачивает макрос чтобы генерить функцию типа лямбды.. То что у него 11 тыщ скачиваний это значит что даже никому неизвестный кривой макрос кому то нужен, т.к. раст не даёт возможности одну переменную скопировать, а другую мувнуть. Ну смешно если честно

niklkelbon
Автор

Ахаха, дааа, ппц прям лучше чем в плюсах, правда лектор не знает что в плюсах можно вернуть лямбду из функции вообще без проблем. Потому что вместо костылей там просто лямбда это какой то тип и почему бы его не вернуть(и почему бы не знать этот тип на компиляции)

niklkelbon