Перейти к содержимому






Фотография
* * * * * 3 голосов

Ржавеем по полному! #3. Функции и указатели.

Написано LeshaInc , 21 Июнь 2016 · 1 029 просмотров

ИзображениеRust

Сегодня познакомимся с функциями и указателями, а также по мелочи: зоны видимости.

 

Функции
Функции в расте похожи на функции в Си, Jawa, луа. Для создания функции используется ключевое слово fn.

fn add(a: i32, b: usize) -> usize {
  a + b
}
После ключевого слова fn идет имя функции, далее в скобках указываются аргументы через запятую, и опционально, стрелочка -> и возвращаемый тип.
Указывая аргументы нужно указывать тип аргумента после символа :.

 

Функции в которых не указано возвращаемое значение, возвращают ()

 

Ключевое слово return возвращает значение из функции.

fn answer() -> i32 {
  return 42;
}
return не всегда обязателен, позже разберемся где он нужен, а где не нужен.

 

Указатели
Указатели в расте гораздо безопаснее чем указатели в Си. Создать указатель на неизменяемые данные можно при помощи &.

let a = 10;
let pa = &a;
Получить значение из указателя можно при помощи символа *.
let a = 10;
let pa = &a;
println!("a = {}; *pa = {}; a + a = {}; *pa + *pa = {}", a, *pa, a + a, *pa + *pa);
// \--> a = 10; *pa = 10; a + a = 20; *pa + *pa = 20
Но в некоторых случаях писать * не обязательно.
let a = 10;
let pa = &a;
println!("a = {}; pa = {}; a + a = {}; pa + pa = {}", a, pa, a + a, pa + pa);
// \--> a = 10; pa = 10; a + a = 20; pa + pa = 20
Раст сам все поймет, за что ему спасибо.
Иногда мы хотим создать изменяемую ссылку. Для этого используется &mut.
let mut a = 10;
let pa = &mut a;
*pa += 1;   // здесь * обязателен
    
println!("{}", pa);   //-->  11
Если мы хотим изменить значение на которое указывает наш указатель, * обязателен. Без него раст не может понять, мы хотим присвоить новый указатель, или значение.
В расте используется концепция "либо один писатель, либо много читателей". В примере выше, переменную a прочитать мы уже не сможем, и писать в нее тоже не сможем, так как она передана указателю pa. pa – писатель.

 

Бывают случаи когда мы хотим присвоить указателю новое значение, то есть сделать так, что бы указатель указывал на другие данные. Это тоже предусмотрено.

let mut a = 10;
let mut b = 20;
let mut pa = &mut a;
    
println!("{}", pa);  // --> 10
    
pa = &mut b;
    
println!("{}", pa);  // --> 20
    
println!("{}", a);  // --> 10
//             ^  ошибка, a уже имеет писателя, читателя не создать.
    
println!("{}", &a);  // --> 10
//             ^-  ошибка, a уже имеет писателя, читателя не создать.
    
println!("{}", &mut a);  // --> 10
//             ^-----  ошибка, a уже имеет писателя, еще одного не создать.
Как видите, все правила про "либо один писатель, либо много читателей" работают даже если на a уже не указывает ничего.

 

Зоны видимости
Зоны видимости в расте ничем не отличаются от тех же в Луа.

fn main() {
  let a = 10;

  {
    let b = 20;
    println!("{}", a);   // --> 10
    println!("{}", b);   // --> 10
  }

  println!("{}", a);   // --> 10
  println!("{}", b);   // --> 10
  //             ^  ошибка, b нет.
}
Хочу отметить только, что в расте все переменные удаляются когда уйдут из зоны видимости. Исключением являются только значения которые возвращаются в функциях.

 

Хозяйке на заметку:

{ и ) это аналог do и end в Луа.

 

На сегодня все. Извините что запоздал с 3 частью, так уж вышло. В следующий раз познакомимся с перечеслениями (enum) и структурами (struct). =)



  • Totoro, Fingercomp, electronic_steve и еще 1 это нравится



Если что то непонятно, вопросы пишите в ирку! Выслушаем всех!

Фотография
Asummonster
23 июн 2016 13:22

Когда гайд?

Когда гайд?



Сегодня.
Фотография
Asummonster
23 июн 2016 13:31

Новый

Новый



В каком смысле новый? 4 часть раста сегодня.
    • Asummonster это нравится

С тех пор прошёл один год, а до сих пор нет четвёртой части.

С тех пор прошёл один год, а до сих пор нет четвёртой части.

 

4 часть


Обратные ссылки на эту запись [ URL обратной ссылки ]

Обратных ссылок на эту запись нет

Последние посетители

  • Фотография
    vlad1vv1
    14 апр 2018 - 12:10
  • Фотография
    Belzebub
    05 апр 2018 - 14:09
  • Фотография
    Laine_prikol
    16 мар 2018 - 20:38
  • Фотография
    fasadik
    27 фев 2018 - 12:24
  • Фотография
    Bleyn
    17 фев 2018 - 21:07
  • Фотография
    VGAMER_Tiger
    16 янв 2018 - 23:54
  • Фотография
    monkey
    26 дек 2017 - 14:37
  • Фотография
    Nova
    25 дек 2017 - 19:00
  • Фотография
    MeXaN1cK
    09 дек 2017 - 00:22
  • Фотография
    Sploom
    27 ноя 2017 - 15:00

Искать в моем блоге

1 посетителей

0 пользователей, 1 гостей, 0 анонимных