Rust
7.91K subscribers
372 photos
38 videos
3 files
937 links
Rust programming language

По всем вопросам- @haarrp

@ai_machinelearning_big_data - машинное обучение

@programming_books_it - бесплатные it книги

@pythonl - 🐍

@ArtificialIntelligencedl - AI

@datascienceiot - ml 📚

#VRHSZ
Download Telegram
🦀 #Rust Совет

Хочешь протестировать что-то быстро, не трогая main.rs?
Создай файлы в директории examples/ внутри своего крейта — и запускай их так:


cargo run --example <имя_файла>


📦 Это удобно для:
• Быстрых экспериментов
• Мини-демо и прототипов
• Локальных тестов без влияния на основную логику

Пример:


cargo run --example my_demo


Отличный способ держать main.rs чистым и при этом экспериментировать свободно.

#junior #rust
👍626🔥4🥰1🤨1
👣 Rust совет дня

Файл build.rs можно превратить в полноценную систему сборки C-кода для Rust.
Пример ниже показывает, как собрать C-обёртку и подключить её вместе с C SDK прямо через Cargo 🦀

📌 Что это значит?
- Можно компилировать C-код и обёртки прямо из Rust-проекта
- Линковать C SDK и подключать их к Rust
- Через println! передавать Cargo специальные инструкции (например, какие библиотеки подключить)



/// build.rs
fn main() {
// Компилируем C-wrapper
cc::Build::new()
.file("src/rplidarx_wrapper.c")
.include("/usr/local/include")
.include("/usr/local/include/src")
.include("/usr/local/include/core")
.compile("rplidarx_wrapper");

// Линкуем обёртку
println!("cargo:rustc-link-lib=static=rplidarx_wrapper");

// Линкуем SDK устройства
println!("cargo:rustc-link-lib=rplidarx_sdk");
println!("cargo:rustc-link-lib=pthread");
println!("cargo:rustc-link-lib=stdc++");

// Путь к библиотекам (если нужен)
println!("cargo:rustc-link-search=native=/usr/local/lib");

// Пересобрать при изменении C-файла
println!("cargo:rerun-if-changed=src/rplidarx_wrapper.c");
}


📌 Эти println! — скрытые build-инструкции для Cargo.
Таким образом, Makefile не нужен: всё управление сборкой C и Rust находится прямо в build.rs.

@rust_code

#junior #rust
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥146🦄2🥰1
🦀 Rust совет

Если при сериализации в JSON вы хотите, чтобы вложенные структуры или enum выглядели как часть общего объекта, используйте атрибут #[serde(flatten)].

Он убирает лишние уровни вложенности и делает JSON более читаемым и удобным.

@rust_code

#junior #rust
👍55🔥167🥰1
🦀 Rust совет: когда использовать &self, &mut self, self и mut self — на реальном примере

Этот сниппет отлично показывает разные модели владения при методах:


// читает, не меняя
fn len(&self) -> usize { … }

// изменяет объект на месте
fn push(&mut self, b: u8) { … }

// забирает владение — после вызова исходный объект больше недоступен
fn into_vec(self) -> Vec<u8> { … }

// builder-стиль: забирает владение, внутри mut, возвращает обновлённый объект
fn with_extra(mut self, extra: Vec<u8>) -> Self { … }


Коротко:
- &self → читаем
- &mut self → изменяем
- self → потребляем объект
- mut self → потребляем + модифицируем и возвращаем (удобно для fluent API)

Понимание этих четырёх форм - ключ к грамотной архитектуре в Rust.

#rust #tip #junior

@rust_code
35👍29🔥8🥰1😡1
🦀 #Rust совет

Result::and_then позволяет последовательно вызывать операции, которые тоже возвращают Result, не создавая вложенных матчей.
Оператор ? решает похожую задачу, но and_then удобен, когда хочется сохранить более функциональный, «комбинаторный» стиль.

#junior #rust
👍44🔥75🥱2🥰1🤔1
👣 Практическое знакомство с Rust: 20 готовых программ с объяснением

Rust быстро набирает популярность благодаря безопасности, скорости и удобству параллелизма. Но лучший способ понять язык — написать несколько работающих программ.

В этой статье собраны минимальные, но полезные примеры, которые помогут почувствовать Rust в деле: работа с переменными, структурами, ошибками, коллекциями и файлами.

https://uproger.com/prakticheskoe-znakomstvo-s-rust-20-gotovyh-programm-s-obyasneniem/

#junior
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍43🤬2🥱2🤗2🥰1🖕1
👣 Отличный пример того, как anyhow делает ошибки в Rust понятнее.

Код на скриншоте показывает, что каждая функция добавляет свой контекст, и в итоге при падении мы видим полную цепочку причин, а не просто финальную ошибку.

Что происходит:
hello0 выбрасывает ошибку с текстом "!!!!!".
hello1 вызывает hello0 и добавляет свой контекст "world".
hello2 вызывает hello1 и добавляет контекст "hello".
main вызывает hello2 и при ошибке печатает весь стек причин.

Что такое цепочка причин:
Это последовательность контекстов, которые добавлялись на каждом уровне вызовов.
Благодаря этому видно не только то, что сломалось, но и где именно.
Каждый уровень в стеке — это подсказка:
какая функция работала,
какой контекст она добавила,
и что пошло не так в конечном итоге.

Вывод при запуске:
hello
Caused by:
0: world
1: !!!!!

Как это читать:
Сверху -контекст "hello".
Под ним - контекст другой функции "world".
А внизу - исходная причина ошибки "!!!!!".

Такой подход делает отладку проще:
видно весь маршрут ошибки — от места падения до верхнего уровня.

#rust #junior
Please open Telegram to view this post
VIEW IN TELEGRAM
👍288🥰3😢1
🚀 Rust совет: используйте const generics, чтобы заставить компилятор агрессивно разворачивать циклы и оптимизировать layout

Идея простая:
если размер структуры или массива заранее известен и мал (например 3, 4, 8, 16), задайте его как const N.
LLVM увидит фиксированный размер и сможет:
• полностью разворачивать циклы
• устранять bounds checks
• делать tight layout и векторизацию

Пример: реализация dot-product для вектора размером N, где компилятор почти всегда превратит цикл в прямую серию операций без оверхеда.

Приём отлично работает для небольших math типов, SIMD алгоритмов, linear algebra структур и game engine компонентов.

#junior
👍43164🥰1🤗1
👣 Rust совет: безопасные матрицы с Const Generics

Const generics позволяют передавать константы на этапе компиляции прямо в типы.

Это особенно полезно для работы с массивами и матрицами, где размеры должны быть строго фиксированы.

Пример - типобезопасная матрица:


struct Matrix<const ROWS: usize, const COLS: usize> {
data: [[f32; COLS]; ROWS],
}

let mat: Matrix<2, 2> = Matrix {
data: [[1.0, 2.0], [3.0, 4.0]],
};

let value = mat.data[1][0]; // 3.0


#rust #rustlang #junior #rusttip
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥74🥰1🤗1
Rust-совет недели 🦀

Можно встроить статический текст прямо в бинарник с помощью include_str!.

Этот макрос читает файл во время компиляции и встраивает его содержимое прямо в программу. Никакого чтения файлов во время выполнения.

Это удобно для:
- шаблонов конфигурации
- встроенных скриптов
- статических ресурсов
- тестовых данных

Пример:


fn main() {
const TEXT: &str = include_str!("static-data.txt");
let program = include_str!("main.rs");
}


Во время компиляции Rust читает файл и помещает его содержимое прямо в исполняемый файл.

Просто, быстро и без runtime IO.

#rust #junior #rustlang
24🔥18👍10🤔2🥰1🤗1