Мова програмування rust: змінні, покажчики, масиви і функції

Відео: C ++ урок 6. Покажчик на покажчик

змінні
Мова програмування Rust: змінні, покажчики, масиви і функції

Змінні в Rust оголошуються ключовим словом let. Якщо тип змінної не вказано, він визначається автоматично з контексту. За замовчуванням всі змінні незмінні (immutable), тобто по суті константи. Ключове слово mut дозволяє створити змінне значення.
let hi = "hi" -
let mut count = 0

При бажанні можна визначити тип явно «в стилі Pascal»:
let mut count: int = 0-

Покажчики та їх типи

За замовчуванням всі змінні і літерали в Rust розміщуються статично в стеці. Для динамічного виділення пам`яті використовуються покажчики, але вони відрізняються від звичних в С / С ++. Є три типи вказівників: запозичені (borrowed, задаються додаванням до змінної префікса «»), що належать (owned, префікс «~») і керовані (managed, префікс «@»). Запозичений покажчик - це те ж, що посилання (reference) в С ++ - він є адресою вже відповідної змінної:
let mut s = "Text" - // Текстова змінна в стеці
let p = s- // Посилання на неї (адреса в пам`яті)
io :: println (* p) - // разименованія посилання і висновок на екран

Належний покажчик, грубо кажучи, еквівалентний класу unique_ptrlt; gt; в С ++: при ініціалізації він виділяє пам`ять в купі і поміщає туди змінну. Цей покажчик унікальний - ніхто інший не може посилатися на ту ж змінну:
let mut s1 = ~ "Text" - // Змінна в купі
let mut s2 = s1- // Семантика переміщення - тепер s2 посилається на виділену
// пам`ять, а s1 не визначений (відбулося «переміщення»)
let p = s1- // ПОМИЛКА! Посилання s1 вже не визначений!

Керований покажчик схожий на shared_ptrlt; gt; в С ++, але він автоматично потрапляє в поле зору збирача сміття того потоку, де він визначений:
let mut s1 = @ "Text" - // Змінна в купі потоку
let mut s2 = s1- // s1 і s2 посилаються на одну і ту ж пам`ять

масиви




У Rust є вбудовані масиви (вектори) - як статичні, так і динамічні:
let a: [int, .. 3] = [1,5,10] - // Статичний масив з 3 елементів
let mut b: @ [int] = @ [1,2,3] - // Динамічний масив з 3 елементів
b + = [4,5,6] - // додаємо ще три елементи

Функції, замикання і засновані на них конструкції

Функції оголошуються в такий спосіб:
fn f1 (val: int) -gt; int {// Функція повертає тип int return 42 + val;
}
io :: println (fmt! ( "% i", f1 (1))) // Виводимо форматований значення 43




Функції не бачать навколишнього їх контексту і можуть спілкуватися з «зовнішнім світом» тільки через змінні в стилі функціональних мов програмування. У тому ж стилі в Rust визначені замикання (анонімні функції з захопленням контексту):
// Функція приймає як аргумент іншу функцію з сигнатурою fn (int)
// і викликає її з параметром 10
fn call_closure_with_ten (b: fn (int)) {b (10) -}
// Змінна в локальному контексті
let captured_var = 20;
// Оголошуємо замиканіе- між || перераховуються аргументи // всі змінні локального контексту видно!
let closure = | arg | println (fmt! ( "captured_var =% d, arg =% d", captured_var, arg));
// Передаємо замикання в функцію
call_closure_with_ten (closure) -

Як і змінні замикання бувають трьох типів: стекові, керовані і належать до різними накладними витратами і областями застосування. Наприклад, так можна визначити максимальне число в масиві за допомогою звичайного (стекового) замикання:
let mut max = 0;
[1, 2, 3] .map (| x | if * x gt; max {max = * x}) -

Дух функціонального програмування в Rust проник навіть в керуючі конструкції. Наприклад, нормального циклу for в Rust немає, але зате є спеціальний синтаксис замикань:
// Функція приймає масив чисел і іншу функцію fn для їх обробки
fn each (v: [Int], op: fn (v: int) -gt; bool) {
let mut n = 0 while n lt; v.len () {
if! op (v [n]) {break;
}
n + = 1;
}
}
// Викликаємо нашу функцію а-ля керуючу конструкцію // Все, що знаходиться в фігурних дужках, стає тілом замикання, // яке передається як другий аргумент у функцію each for each ([2, 4, 8, 5, 16]) | n | {If * n% 2! = 0 {
println ( "found odd number!");
break;
}
}

Для людей, які прийшли з імперативних мов, це виглядає як тарабарщина, але зате адепти функціонального стилю будуть відчувати себе як вдома.

ІНШЕ

Мова програмування vala фото

Мова програмування vala

Hello world! Розгляд будь-якої мови програмування традиційно належить починати з найпростішої програми «Hello…

Взаємодія chaiscript з c ++ фото

Взаємодія chaiscript з c ++

Відео: Jason Turner: Why and How To Add ScriptingІдеологія взаємодії ChaiScript і С ++ Скриптова мова ChaiScript…

» » Мова програмування rust: змінні, покажчики, масиви і функції