Skip to content

Latest commit

 

History

History
299 lines (250 loc) · 13.1 KB

ch-01-print-hello.md

File metadata and controls

299 lines (250 loc) · 13.1 KB

Привет, Rust!

Простейшая программа выглядит следующим образом:

fn main() {
}

Эта программа не делает ничего - просто работает. Обратите внимание, что мы написали. Это функция с именем 'main". Под функцией понимается набор инструкций, которые что-либо делают и этот набор имеет имя.

Разберём синтаксис. "fn" - это сокращение от английского слова "function" - функция. Далее пишем имя "main". Круглые скобки обозначают блок, который может содержать входные параметры функции. Далее следует блок фигурных скобок, в котором могут находиться операторы и выражения.

Функция "main" является главной функцией. Именно её содержимое выполняется при запуске программы.

Для проверки работы программы вам не понадобиться ничего устанавливать на компьютер. Достаточно перейти на страничку play.rust-lang.org, втавить в поле ввода код программы и нажать кнопку "Run". Результат работы программы будет отображён в нижней части экрана. play.rust-lang.org

Итак, напишем программу, которая печатает в терминальную строку текст.

fn main() {
    println!("Привет, Rust!");
}

Перейдя по ссылке, вы перейдёте в среду разработки Rust Playground и, нажав кнопку "Run", сможете посмотреть, на результат работы программы.

А теперь разберём синкаксис этот программы шаг за шагом, символ за символом:

  • println - это имя макроса стандартной библиотеки Rust. Есть также printи другие. Каждый служит определённым целям.
  • ! - это символ-индикатор, сообщающий о том, что предшествующее имя является макросом. Без этого символа слово print будет обозначать имя функции. Такой функции нет в стандартной библиотеки и чтобы в этом убедиться достаточно удалить этот символ и снова выполнить программу. Будет ошибка, описание которой сообщит, что такой функции нет. Кроме того из описания вы можете узнать, как эту ошибку исправить.
  • ( - это символ-индикатор начала списка аргументов макроса.
  • " - это символ-индикатор начала текстовых данных.
  • Привет, Rust! - это содержание текстовых данных.
  • " - это символ-индикатор конца текстовых данных.
  • ) - это символ-индикатор конца списка аргументов макроса.
  • ; - это символ-индикатор конца оператора.

Язык Rust различает символы верхнего и нижниго регистра и, поэтому, например, имена функций: println, printlN, printLn, prinTln, priNtln, prIntln, pRintln, Println будут именами различных функций. Запустите эту программу в среде разработки и, следуя указаниям текстовых сообщений компилятора, вы ещё многое узнаете о хорошем стиле Rust-программирования

fn println() {
    println!("println");
}
fn PrintlN() {
    println!("PrintlN");
}
fn pRintLn() {
    println!("pRintLn");
}
fn prInTln() {
    println!("prInTln");
}
fn priNtln() {
    println!("priNtln");
}

fn main() {
    println();
    PrintlN();
    pRintLn();
    prInTln();
    priNtln();
    prInTln();
    pRintLn();
    PrintlN();
}

Run in Rust Playground

Шаблон println!

Рассмотренный нами ранее макрос println! можно усложнить, использовав возможность ввода входных данных. Текстовые данные могут содержать специальные конструкции, благодаря которым текст на консоли будет заполнен данными:

fn main() {
    println!("Привет, Rust!");
    println!("{}{}{}{}{}", "Привет", ",", " ", "Rust", "!");
}

Run in Rust Playground

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

Очень важной особенностью Rust является проверка необходимого количества входных данных для текстового шаблона. Если, например, мест для всех данных не будет хватать или входных данных будет мало или, наоборот, много - компилятор вам об этом сообщит, а программа работать не будет.

Пожалуйста, самостоятельно попробуйте сделать как можно больше ошибок в коде ранее написанной программы. Run in Rust Playground

Таблица умножения

С помощью уже полученных знаний напечатаем таблицу умножения.

	2	3	4	5	6	7	8	9
------------------------------------------------------------------
2	|4	6	8	10	12	14	16	18
3	|6	9	12	15	18	21	24	27
4	|8  	12	16	20	24	28	32	36
5	|10	15	20	25	30	35	40	45
6	|12	18	24	30	36	42	48	54
7	|14	21	28	35	42	49	56	63
8	|16	24	32	40	48	56	64	72
9	|18	27	36	45	54	63	72	81
fn main() {
    println!("
        {}	{}	{}	{}	{}	{}	{}	{}
  ---------------------------------------------------------------{}
2|      4\t6	8	10	12	14	16	18
3|      6\t9	12	15	18	21	24	27
4|      8\t12	16	20	24	28	32	36
5|      10\t15	20	25	30	35	40	45
6|      12\t18	24	30	36	42	48	54
7|      14\t21	28	35	42	49	56	63
8|      16\t24	32	40	48	56	64	72
9{}      18{}27	36	45	54	63	72	81
    ",2,3,4,5,6,7,8,9,'-','|','\t');

}

Run in Rust Playground.

Обратите внимание, что в данном примере в качестве входных параметров макроса мы используем числа и символы. Всё это так называемые примитивные - т.е. самые простые типы данных. Обратите внимание, что символами могут быть различные символы. Символ табуляции - \t - пример специального символа. Также в шаблонах макроса можно использовать и другие специальные символы - например, \n (перевод строки), \r (возврат каретки).

Также с их помощью можно рисовать в консоли:

Все любят котиков

С помощью макроса println можно рисовать. Например, нарисуем котика Барсика.

fn main() {
    println!("
          />   フ
     |  +  +|
     /`ミ _x 彡
     /      |
    /  ヽ   ノ
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ

    ");

}

Run in Rust Playground.

2 + 2 = 4 ?

Кроме строк, символов и чисел есть ещё логические типы данных. Их также можно выводить на печать консоли. Также можно производить математические вычисления.

fn main() {
    println!("{} + {} = {} - {}", 2, 2, 2 + 2, 2 + 2 == 4);
    println!("{} + {} = {} - {}", 2, 2, 5, 2 + 2 == 5);
}

Run in Rust Playground.

Печатаем длинную строку

Кроме всего прочего при работе с текстовыми строками можно объединять строки в одну. Например, на консоль можно вывести длинную строку, при этом в коде программы строка будет удобной для чтения:

fn main() {
    println!(
        "++++++++++++++++++++++++++++++\
         ++++++++++++++++++++++++++++++\
         ++++++++++++++++++++++++++++++\
         ++++++++++++++++++++++++++++++\
         "
    );
}

Run in Rust Playground. Пожалуйста, самостоятельно придумайте пример, в котором пригодится данная опция.

Комментарии в коде

Комментарии служат для внесения ясности, документации а также других задач. В Rust комментарии могут быть однострочные и многострочные. Однострочные обозначаются //, многострочные обрамляются символами /* в начале и */ в конце. Комментрации могут быть вложенными, но для удобства не рекомендуется этого делать.

/* Это /* синтаксически верные*/
комментарии, даже  /* если /* они сами содержат
комментарии*/ внутри  */себя. */

fn main() {

}

Run in Rust Playground.

Домашнее задание

Пожалуйста, с помощью чисел, символов, текста, логических символов придумайте интересную задачу или историю. Например, такую:

fn main() {
 print!("
 /_/
(•-•)
/つ🌷 хочешь цветочек?

 /__/
(•-•)
/つ🍪 о, или печеньку?

 /_/
(•-•)
/ >🐈 может кису?

 /__/
(•-•)
/つ❤ хм, может... Моё сердечко?

(\\__(\\
('•֊ •')
  O❤O да, думаю, то что надо.

 ");
}

Run in Rust Playground. Или такую:

    _~^~^~_
\) /  o o  \ (/
  '_   ¬   _'
  \ '-----' /
   +
  + +
+     +
+-----+
| .-. |
| | | |
+-+-+-+
 /\_/\   -----
( ' ' ) / Hello \
 ( - ) < Junior |
 | | |  \ Coder!/
(__|__)   -----

Или инфографику:

fn main() {
 print!("
\t Мы изучали печать на консоль \n
------------------------
Числа\tСтроки\tСимволы
\t\t\n
\tRust типы данных\t\n
\t\t\n
 \tБулевы
 ");
}

Run in Rust Playground.