Компилятор запускает первой функцию fn main(){/*..*/} - это вход в программу, в ней мы пишем весь свой код. В теле функции находится вся программа. Данная функция должна существовать в проекте, но может отсутствовать в библиотеке.
Наша программа - по этапно.
1. Мы запускаем компилятор cargo run
2. Компилятор функцию вызывает main()
3. main() запускает {}
4. /*Код, который будет запущен.*/
5. Программа завершается и закрывается.
Код, который будет запущен, разрастается или становится не читаемым. в таком случае можно поступит двумя путями: либо структурировать или вынести в функцию.
Функции.
В таком случае мы можем создать свою функцию и переместить код в тело новой функции. А в теле функции main(), вызвать созданную функцию.
Наша программа - теперь.
1. Компилятор вызывает main()
2. main() вызывает функцию `func()
3. func() запускает код {/*Код, который будет запущен.*/}
4. `//..` может что-то ещё...
5. Программа завершается и закрывается.
В данном примере функция просто выполняет код, не принимая и не возвращая никаких данных.
Давайте рассмотрим функции более подробно.
Функции можно выполнить неограниченное количество раз. Она принимает на вход данные, обрабатывает, и возвращает данные и выполняет в теле-функции любые операции.
Варианты использования функций:
1. Выполнять код в функции, не зависимо от данных и не возвращая их.
2. Получать данные, взаимодействовать с ними, но не возвращая их.
3. Не приминая данные, возвращает в переменную данные, из самой функции.
4. Получить данные, обработать их и возвращает данные в переменную.
fn name() - создает функцию.
main - это имя функции, мы сами выбираем имя. (пишутся в нижнем регистре `snake_case`).
`()` - В скобки мы принимаем аргументы, переменные для использования в фигурных скобках`{}`.
Примеры аргументов:
1. () не принимаем аргументы.
2. (name: i32) по значению переменные.
3. (&name: i32) ссылки на переменные.
4. (&mut name: i32) изменяемые ссылки на переменные.
Аргумент используется в теле функции указывается как `name`. (или как указатель `*name`)
`->i32`(`->`и тип данных) - указывается тип данных, которые возвращает функция. Можно не указывать, если функция ничего не возвращает(по умолчанию `->()`).
Тело функции {/*..*/} :
1. {__;}- этот код запускает, при вызове функции. (когда не указан тип данных).
2. {x} - этот код возвращает, данные при вызове функции. Не ставятся `;` - когда данные остаются в функции(неявное возвращение).
3. {return x;} - этот код так же возвращает, данные при вызове функции. но при этом данные возвращает return, и ставятся `;`.(явное возвращение).
Структура
Структура и имплементация - позволяет создать систему, где есть внешний интерфейс и внутренний - скрытая часть, со всей логикой. Структура - это абстрактные данные, а имплементация позволяет создать логику. В итоге создается объект, который работает с методами. Такой объект, имеет многие принципы ООП.
Методы - это те же функции, только они тесно связаны с структурой. Во внутренней логике они точно также используют поля переменных, только принимают их неявно, использую объект. object.method(); ровно Structure::method(object);
Структура - тип данных.
struct (Структура) - это пользовательский тип данных, которая может хранить несколько полей переменных, логически связанных данных, похож на кортеж. Кортеж же больше похож на перечисление разных типов.
Нужно создать структуру, и задать поля и типы для них. Далее нужно создать как минимум один экземпляр структуры и заполнить данными, и можно взаимодействовать и получать данные обращаясь через структуру.
Структура и имплементация.
Имплементация — программная или аппаратная реализация какого-либо протокола, алгоритма, технологии. Тем самым, мы создаем возможность работать через методы.
Документация Structure:
- fn new() ->Self
- объект структуры, с данными.
- fn method(&self)
- Изменяет данные объекта, на заранее записанные.
- Self - это тоже самый тип, для которого создан метод, т.е. это `fn new() -> Structure`
- &self, &mut self - это передача, объекта в метод.
- :: - проити в каталог, найти в структуре метод.
Структура и функции.
Структура может работать и с функциями. Функция принимает аргумент в качестве структуры(в данный момент), и возвращает данные определенного типа. В теле-функции происходит взаимодействие со структурой например получение данных.
Отличии от имплементации. Мы не создаем объект, в которой происходит вся логика. А передаем и получаем результат.
Например: С помощью функции new(), я создаю экземпляр структуры и записываю результат в переменную, а с помощью name() и age() получаю данные. Но тут есть свои нюансы со владения. Обратите внимание на & - это означает что мы передаем ссылку, не передаем владение в функцию. а в функции мы создаем копию этих данных.