Что такое владение в Rust?
Владение является центральной особенностью языка Rust. Хотя эту особенность легко объяснить, она весьма сильно повлияла на остальную часть языка.
Все программы во время выполнения используют память компьютера и используют разные подходы для управления своей памятью. В одних языках программирования для этой цели используют систему сборки мусора (garbage collection, GC) постоянно следящую за памятью программы, которая больше не используется программой. В других языках программист должен сам явно запрашивать и освобождать память. Rust же использует третий подход: память управляется с помощью системы владения с набором правил, которые компилятор проверяет только во время компиляции программы. Ни одно из правил владения не замедляет выполнение программы.
Читать дальше
@rust_code
Владение является центральной особенностью языка Rust. Хотя эту особенность легко объяснить, она весьма сильно повлияла на остальную часть языка.
Все программы во время выполнения используют память компьютера и используют разные подходы для управления своей памятью. В одних языках программирования для этой цели используют систему сборки мусора (garbage collection, GC) постоянно следящую за памятью программы, которая больше не используется программой. В других языках программист должен сам явно запрашивать и освобождать память. Rust же использует третий подход: память управляется с помощью системы владения с набором правил, которые компилятор проверяет только во время компиляции программы. Ни одно из правил владения не замедляет выполнение программы.
Читать дальше
@rust_code
👍5❤1🔥1🥰1👏1
Определение и инициализация структур
Структуры похожи на кортежи, рассмотренные в разделе "Тип Кортеж", так как оба хранят несколько связанных значений. Как и кортежи, части структур могут быть разных типов. В отличие от кортежей, в структуре необходимо именовать каждую часть данных для понимания смысла значений. Добавление этих имён обеспечивает большую гибкость структур по сравнению с кортежами: не нужно полагаться на порядок данных для указания значений экземпляра или доступа к ним.
Для определения структуры указывается ключевое слово struct и её название. Название должно описывать значение частей данных, сгруппированных вместе. Далее, в фигурных скобках для каждой новой части данных поочерёдно определяются имя части данных и её тип. Каждая пара имя: тип называется полем. Листинг 5-1 описывает структуру для хранения информации об учётной записи пользователя:
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
Читать дальше
@rust_code
Структуры похожи на кортежи, рассмотренные в разделе "Тип Кортеж", так как оба хранят несколько связанных значений. Как и кортежи, части структур могут быть разных типов. В отличие от кортежей, в структуре необходимо именовать каждую часть данных для понимания смысла значений. Добавление этих имён обеспечивает большую гибкость структур по сравнению с кортежами: не нужно полагаться на порядок данных для указания значений экземпляра или доступа к ним.
Для определения структуры указывается ключевое слово struct и её название. Название должно описывать значение частей данных, сгруппированных вместе. Далее, в фигурных скобках для каждой новой части данных поочерёдно определяются имя части данных и её тип. Каждая пара имя: тип называется полем. Листинг 5-1 описывает структуру для хранения информации об учётной записи пользователя:
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
Читать дальше
@rust_code
🔥4👍2
Интеллектуальный брутфорс: пишем головоломку и солвер для неё
https://habr.com/ru/company/beeline/blog/663852/
https://habr.com/ru/company/beeline/blog/663852/
Хабр
Интеллектуальный брутфорс: пишем головоломку и солвер для неё
Небольшое предисловие В колледже я много играл в головоломки . В статье под головоломками я буду подразумевать очень узкое подмножество таких игр. Вот некоторые из примеров: Stephen's Sausage Roll...
🔥5❤1
Ссылочные переменные и заимствование
Основная проблематика в подходе с использованием кортежа в листинге 4-5 заключается в том, что мы должны вернуть String в вызывающую функцию, чтобы мы могли использовать String после вызова функции calculate_length, потому что String была перемещена в функциюcalculate_length. Вместо этого мы можем предоставить ссылку на значение String Ссылка похожа на указатель в том смысле, что это адрес, по которому мы можем получить доступ к данным, хранящимся по этому адресу, принадлежащему какой-либо другой переменной. В отличие от указателя, ссылка гарантированно указывает на допустимое значение определённого типа. Вот как вы могли бы определить и использовать функцию calculate_length которая имеет ссылку на объект в качестве параметра вместо того, чтобы владеть значением:
Файл: src/main.rs
Читать дальше
@rust_code
Основная проблематика в подходе с использованием кортежа в листинге 4-5 заключается в том, что мы должны вернуть String в вызывающую функцию, чтобы мы могли использовать String после вызова функции calculate_length, потому что String была перемещена в функциюcalculate_length. Вместо этого мы можем предоставить ссылку на значение String Ссылка похожа на указатель в том смысле, что это адрес, по которому мы можем получить доступ к данным, хранящимся по этому адресу, принадлежащему какой-либо другой переменной. В отличие от указателя, ссылка гарантированно указывает на допустимое значение определённого типа. Вот как вы могли бы определить и использовать функцию calculate_length которая имеет ссылку на объект в качестве параметра вместо того, чтобы владеть значением:
Файл: src/main.rs
Читать дальше
@rust_code
👍4🔥2
Срезы
Другим типом данных, который не забирает во владение данные является срез (slice). Срез позволяет ссылаться на смежную последовательность элементов из коллекции, вместо полной коллекции.
Рассмотрим небольшую программную проблему: необходимо написать функцию, входным параметром которой является строка, а выходным значением функции является первое слово, которое будет найдено в этой строке. Если функция не находит пробелы, она возвращает полную строку.
Читать дальше
@rust_code
Другим типом данных, который не забирает во владение данные является срез (slice). Срез позволяет ссылаться на смежную последовательность элементов из коллекции, вместо полной коллекции.
Рассмотрим небольшую программную проблему: необходимо написать функцию, входным параметром которой является строка, а выходным значением функции является первое слово, которое будет найдено в этой строке. Если функция не находит пробелы, она возвращает полную строку.
Читать дальше
@rust_code
👍6
Используем клиентский процессор по максимуму. Часть 1: Rust + WebAssembly
https://habr.com/ru/company/ruvds/blog/662363/
https://habr.com/ru/company/ruvds/blog/662363/
Хабр
Используем клиентский процессор по максимуму. Часть 1: Rust + WebAssembly
На Хабре существует немало статей, посвящённых повышению производительности программ за счёт параллельных вычислений и использования векторных команд. Я решил дополнить этот список и рассказать о...
👍7❤1
Перечисления и Сопоставление с образцом
В этой статье мы рассмотрим перечисления, также называемые enums. Перечисления позволяют определять тип, перечисляя его возможные варианты. Сначала, мы определим и воспользуемся перечислением, чтобы показать, как перечисление может закодировать значение вместе с данными. Далее мы рассмотрим особенно полезный enum, называемый Option, который выражает факт того, что значение может быть либо чем-то, либо ничем. Потом мы посмотрим на сопоставление с образцом в match выражении, позволяющем легко выполнять разный код для различных значений перечисления. Наконец, мы рассмотрим конструкцию if let - ещё одну удобную и лаконичную идиому, которая позволяет вам управлять перечислениями в коде.
Перечисления являются особенностью многих языков, но в каждом языке их возможности различаются. Перечисления в Rust наиболее похожи на алгебраические типы данных, Algebraic Data Types, представленные в таких функциональных языках как F#, OCaml и Haskell.
Читать дальше
@rust_code
В этой статье мы рассмотрим перечисления, также называемые enums. Перечисления позволяют определять тип, перечисляя его возможные варианты. Сначала, мы определим и воспользуемся перечислением, чтобы показать, как перечисление может закодировать значение вместе с данными. Далее мы рассмотрим особенно полезный enum, называемый Option, который выражает факт того, что значение может быть либо чем-то, либо ничем. Потом мы посмотрим на сопоставление с образцом в match выражении, позволяющем легко выполнять разный код для различных значений перечисления. Наконец, мы рассмотрим конструкцию if let - ещё одну удобную и лаконичную идиому, которая позволяет вам управлять перечислениями в коде.
Перечисления являются особенностью многих языков, но в каждом языке их возможности различаются. Перечисления в Rust наиболее похожи на алгебраические типы данных, Algebraic Data Types, представленные в таких функциональных языках как F#, OCaml и Haskell.
Читать дальше
@rust_code
👍8
Что выведет код ?
struct S;
fn main() {
let [x, y] = &mut [S, S];
let eq = x as *mut S == y as *mut S;
print!("{}", eq as u8);
}
Ответ:1
@rust_code
struct S;
fn main() {
let [x, y] = &mut [S, S];
let eq = x as *mut S == y as *mut S;
print!("{}", eq as u8);
}
Ответ:
👍7
Rust с 0 до 80% для JavaScript разработчиков
https://habr.com/ru/post/666246/
https://habr.com/ru/post/666246/
Хабр
Rust с 0 до 80% для JavaScript разработчиков
Эта статья — перевод оригинальной статьи Michael Salim " Rust from 0 to 80% for JavaScript Developers " Также я веду телеграм канал “ Frontend по-флотски ”, где рассказываю про интересные вещи из мира...
🔥7
Rust 1.61.0: пользовательские коды возврата в main, расширение возможностей const fn и изменение IO-блокировок
https://habr.com/ru/post/666850/
@rust_code
https://habr.com/ru/post/666850/
@rust_code
Хабр
Rust 1.61.0: пользовательские коды возврата в main, расширение возможностей const fn и изменение IO-блокировок
Команда Rust рада сообщить о новой версии языка — 1.61.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение. Если у вас есть предыдущая...
👍6
Используем клиентский процессор по максимуму. Часть 2: SIMD + мультипоточность
https://habr.com/ru/company/ruvds/blog/663936/
https://habr.com/ru/company/ruvds/blog/663936/
Хабр
Используем клиентский процессор по максимуму. Часть 2: SIMD + мультипоточность
Снова поговорим об ускорении работы клиентской стороны веб-приложения и о том, как для этого задействовать все вычислительные ресурсы процессора. В предыдущей части мы нарисовали фрактал Ньютона с...
❤4
bat — продвинутая замена cat/less или о том, как Rust набирает обороты
https://www.youtube.com/watch?v=3w3NndD6BKI
@rust_code
https://www.youtube.com/watch?v=3w3NndD6BKI
@rust_code
YouTube
bat — продвинутая замена cat/less или о том, как Rust набирает обороты
Поговорим о современных аналогах классических *nix программ, написанных на Rust — в частности о bat, продвинутой версии cat и less.
bat — https://github.com/sharkdp/bat
Мой курс «Хардкорная веб-разработка» — https://course.to.digital
Книжный клуб Ботаним!…
bat — https://github.com/sharkdp/bat
Мой курс «Хардкорная веб-разработка» — https://course.to.digital
Книжный клуб Ботаним!…
👍7🔥2
Управление растущими проектами с помощью пакетов, крейтов и модулей
По мере роста кодовой базы ваших программ, организация проекта будет иметь большое значение, ведь отслеживание всей программы в голове будет становиться всё более сложным. Группируя связанные функции и разделяя код по основным функциональностям, (фичам, feature), вы делаете более прозрачным понимание о том, где искать код реализующий определённую функцию и где стоит вносить изменения для того чтобы изменить её поведение.
Программы, которые мы писали до сих пор, были в одном файле одного модуля. По мере роста проекта, мы можем организовывать код иначе, разделив его на несколько модулей и несколько файлов. Пакет может содержать несколько бинарных крейтов и опционально один крейт библиотеки. По мере роста пакета мы также можем извлекать части нашей программы в отдельные крейты, которые затем станут внешними зависимостями для основного кода нашей программы. Эта глава охватывает все эти техники. В свою очередь для очень крупных проектов, состоящих из набора взаимосвязанных пакетов развивающихся вместе, Cargo предоставляет рабочие пространства, workspaces, их мы рассмотрим за пределами данной главы, в разделе "Рабочие пространства Cargo" Главы 14.
Дополнительно к группированию функциональности, инкапсуляция деталей реализации позволяет повторно использовать код на более высоком уровне: после реализации операции, другой код может вызывать этот код через открытый интерфейс, не зная как работает реализация. То, как вы пишете код, определяет какие части общедоступны для использования другим кодом и какие части являются закрытыми деталями реализации для которых вы оставляете право на изменения только за собой. Это ещё один способ ограничить количество деталей, которые вы должны держать в голове.
Связанное понятие - это область видимости: вложенный контекст в котором написан код имеющий набор имён, которые определены «в текущей области видимости». При чтении, письме и компиляции кода, программистам и компиляторам необходимо знать, относится ли конкретное имя в определённом месте к переменной, к функции, к структуре, к перечислению, к модулю, к константе или другому элементу и что означает этот элемент. Можно создавать области видимости и изменять какие имена входят или выходят за их рамки. Нельзя иметь два элемента с тем же именем в одной области; есть доступные инструменты для разрешения конфликтов имён.
Rust имеет ряд функций, которые позволяют управлять организацией кода, в том числе управлять тем какие детали открыты, какие детали являются частными, какие имена есть в каждой области вашей программы. Эти функции иногда вместе именуемые модульной системой включают в себя:
Пакеты, Packages: Функционал Cargo позволяющий собирать, тестировать и делиться крейтами
Крейты, Crates: Дерево модулей, которое создаёт библиотечный или исполняемый файл
Модули, Modules и use: Позволяют вместе контролировать организацию, область видимости и конфиденциальность путей
Пути, Paths: способ именования элемента, такого как структура, функция или модуль
Читать дальше
@rust_code
По мере роста кодовой базы ваших программ, организация проекта будет иметь большое значение, ведь отслеживание всей программы в голове будет становиться всё более сложным. Группируя связанные функции и разделяя код по основным функциональностям, (фичам, feature), вы делаете более прозрачным понимание о том, где искать код реализующий определённую функцию и где стоит вносить изменения для того чтобы изменить её поведение.
Программы, которые мы писали до сих пор, были в одном файле одного модуля. По мере роста проекта, мы можем организовывать код иначе, разделив его на несколько модулей и несколько файлов. Пакет может содержать несколько бинарных крейтов и опционально один крейт библиотеки. По мере роста пакета мы также можем извлекать части нашей программы в отдельные крейты, которые затем станут внешними зависимостями для основного кода нашей программы. Эта глава охватывает все эти техники. В свою очередь для очень крупных проектов, состоящих из набора взаимосвязанных пакетов развивающихся вместе, Cargo предоставляет рабочие пространства, workspaces, их мы рассмотрим за пределами данной главы, в разделе "Рабочие пространства Cargo" Главы 14.
Дополнительно к группированию функциональности, инкапсуляция деталей реализации позволяет повторно использовать код на более высоком уровне: после реализации операции, другой код может вызывать этот код через открытый интерфейс, не зная как работает реализация. То, как вы пишете код, определяет какие части общедоступны для использования другим кодом и какие части являются закрытыми деталями реализации для которых вы оставляете право на изменения только за собой. Это ещё один способ ограничить количество деталей, которые вы должны держать в голове.
Связанное понятие - это область видимости: вложенный контекст в котором написан код имеющий набор имён, которые определены «в текущей области видимости». При чтении, письме и компиляции кода, программистам и компиляторам необходимо знать, относится ли конкретное имя в определённом месте к переменной, к функции, к структуре, к перечислению, к модулю, к константе или другому элементу и что означает этот элемент. Можно создавать области видимости и изменять какие имена входят или выходят за их рамки. Нельзя иметь два элемента с тем же именем в одной области; есть доступные инструменты для разрешения конфликтов имён.
Rust имеет ряд функций, которые позволяют управлять организацией кода, в том числе управлять тем какие детали открыты, какие детали являются частными, какие имена есть в каждой области вашей программы. Эти функции иногда вместе именуемые модульной системой включают в себя:
Пакеты, Packages: Функционал Cargo позволяющий собирать, тестировать и делиться крейтами
Крейты, Crates: Дерево модулей, которое создаёт библиотечный или исполняемый файл
Модули, Modules и use: Позволяют вместе контролировать организацию, область видимости и конфиденциальность путей
Пути, Paths: способ именования элемента, такого как структура, функция или модуль
Читать дальше
@rust_code
👍5