diff --git a/lessons/ro/chapter_1.yaml b/lessons/ro/chapter_1.yaml new file mode 100644 index 000000000..5039d8d9b --- /dev/null +++ b/lessons/ro/chapter_1.yaml @@ -0,0 +1,227 @@ +- title: Capitolul 1 - The Basics + content_markdown: > + În acest prim capitol vom explora ideile și conceptele de bază despre + funcții, variabile și tipurile primitive de date. Ne bucurăm că + ne sunteți alături! + + + De asemenea, în cazul în care vă întrebați cine este crabul adorabil care + vă vorbește, mă numesc **Ferris**, + mascota neoficială a limbajului Rust. Încântat de cunoștință! + + + Odată ce vă veți familiariza cu Rust, puteți să vă declarați un **Rustaceu**. Așa + se numesc toți oamenii care folosesc, contribuie sau sunt interesați de Rust. +- title: The Rust Playground + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20println!(%22Bun%20venit%20în%20locul%20de%20joacă!%20Puteți%20modifica%20codul%20aici.%22)%3B%0A%7D%0A + content_markdown: > + În acest curs veți folosi un utilitar interactiv pentru scrierea codului [Rust + Playground](https://play.rust-lang.org). + + + E o modalitate bună de a vă juca cu Rust și a arăta altora + creativitatea și provocările dumneavoastră! +- title: Variabile + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20%2F%2F%20rust%20infers%20the%20type%20of%20x%0A%20%20%20%20let%20x%20%3D%2013%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%0A%20%20%20%20%2F%2F%20rust%20can%20also%20be%20explicit%20about%20the%20type%0A%20%20%20%20let%20x%3A%20f64%20%3D%203.14159%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%0A%20%20%20%20%2F%2F%20rust%20can%20also%20declare%20and%20initialize%20later%2C%20but%20this%20is%20rarely%20done%0A%20%20%20%20let%20x%3B%0A%20%20%20%20x%20%3D%200%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%7D%0A + content_markdown: > + Variabilele sunt declarate folosind cuvântul cheie **let**. + + + Atunci când dai unei variabile o valoare, Rust este capabil să deducă tipul acesteia + în 99% + + din cazuri. Dacă acesta nu poate, puteți adăuga tipul de date la declararea variabilei. + + + Observați cum putem să dăm valori aceluiași nume de variabilă de mai multe ori. Acest + fenomen se numește variable + + shadowing (punere în umbră) și tipul de date se poate schimba pentru referințe ulterioare + la acel nume de variabilă. + + + Numele de variabile sunt mereu scrise sub formă `snake_case` (ex: my_first_variable). +- title: Modificarea variabilelor + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20mut%20x%20%3D%2042%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%20%20%20%20x%20%3D%2013%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%7D%0A + content_markdown: > + Limbajul Rust ține foarte mult la ce variabile pot fi modificate. Variabilele + + fac parte din două categorii: + + + * **mutabile** (mutable) - compilatorul va lăsa utilizatorul să modifice șî + să citească valoarea acestui tip de variabile. + + * **imutabile** (immutable) - compilatorul va lăsa utilizatorul doar să citească valoarea acestei variabile. + + + Valorile mutabile sunt declarate cu ajutorul cuvântului cheie **mut**. + + + O să revenim pentru a vorbi mai multe despre acest concept, dar deocamdată doar fiți + atent la acest cuvânt cheie. +- title: Tipuri de date de bază + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20x%20%3D%2012%3B%20%2F%2F%20by%20default%20this%20is%20i32%0A%20%20%20%20let%20a%20%3D%2012u8%3B%0A%20%20%20%20let%20b%20%3D%204.3%3B%20%2F%2F%20by%20default%20this%20is%20f64%0A%20%20%20%20let%20c%20%3D%204.3f32%3B%0A%20%20%20%20let%20bv%20%3D%20true%3B%0A%20%20%20%20let%20t%20%3D%20(13%2C%20false)%3B%0A%20%20%20%20let%20sentence%20%3D%20%22hello%20world!%22%3B%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%22%2C%0A%20%20%20%20%20%20%20%20x%2C%20a%2C%20b%2C%20c%2C%20bv%2C%20t.0%2C%20t.1%2C%20sentence%0A%20%20%20%20)%3B%0A%7D%0A + content_markdown: > + Rust are o varietate de tipuri de date familiare dumneavoastră: + + + * booleans - `bool` pentru a reprezenta adevărat și fals + + * unsigned integers - `u8` `u16` `u32` `u64` `u128` pentru a reprezenta + numere nenegative întregi + + * signed integers - `i8` `i16` `i32` `i64` `i128` pentru a reprezentare numere întregi + + * pointer sized integers - `usize` `isize` pentru a reprezenta indexi + + și dimensiunea lucrurilor în memorie + + * floating point - `f32` `f64` pentru a reprezenta numere reale + + * tuple (tuplu) - `(value, value, ...)` pentru trecerea unor secvențe fixe de valori pe stivă + + * arrays - `[value, value, ...]` o colecție cu dimensiune fixă de elemente similare + cunoscută la momentul compilării + + * slices - o colecție cu dimensiune cunoscută în timpul rulării de elemente similare + + * `str`(string slice) - text de lungime cunoscută în timpul rulării + + + Sintaxa s-ar putea să fie mai complexă în Rust față de alte limbaje de programare cu care sunteți obișnuit; + + având în vedere că Rust este un limbaj de programare pentru sisteme, îi pasă de probleme legate + + de memorie cu care s-ar putea să nu fiți obișnuit. O să aprofundăm aceste lucruri mai târziu. + + + Tipurile numerice pot fi impuse prin adăugarea la finalul unui număr (ex: `13u32`, `2u8`). +- title: Conversia tipurile de bază + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20a%20%3D%2013u8%3B%0A%20%20%20%20let%20b%20%3D%207u32%3B%0A%20%20%20%20let%20c%20%3D%20a%20as%20u32%20%2B%20b%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20c)%3B%0A%0A%20%20%20%20let%20t%20%3D%20true%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20t%20as%20u8)%3B%0A%7D%0A + content_markdown: > + Rust are nevoie de explicitate când vine vorba de tipurile numerice. Nu puteți + + folosi un `u8` pentru un `u32` în mod neglijent fără + + apariția unei erori. + + + Din fericire, Rust poate face conversia de la un tip numeric la altul foarte ușor + folosind cuvântul cheie **as**. +- title: Constante + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=const%20PI%3A%20f32%20%3D%203.14159%3B%0A%0Afn%20main()%20%7B%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22To%20make%20an%20apple%20%7B%7D%20from%20scratch%2C%20you%20must%20first%20create%20a%20universe.%22%2C%0A%20%20%20%20%20%20%20%20PI%0A%20%20%20%20)%3B%0A%7D%0A + content_markdown: > + Constantele ne permit să specificăm o valoare folosită uzual de-a lungul + + codului nostru în mod eficient. În loc să copiem valori folosind variabile + + acolo unde sunt folosite, constantele înlocuiesc direct numele lor cu + valoarea + + lor acolo unde sunt folosite. + + + Spre deosebire de variabile, constantele vor fi mereu declarate cu tip de date specific. + + + Numele constantelor sunt mereu scrise în format `SCREAMING_SNAKE_CASE` (ex: MY_FIRST_CONSTANT). +- title: Array-uri + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20nums%3A%20%5Bi32%3B%203%5D%20%3D%20%5B1%2C%202%2C%203%5D%3B%0A%20%20%20%20println!(%22%7B%3A%3F%7D%22%2C%20nums)%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20nums%5B1%5D)%3B%0A%7D%0A + content_markdown: > + Un *array* este o **colecție de dimensiune fixă** de elemente care conțin date de același + tip. + + + Tipul de date pentru un *array* este scris sub forma `[T;N]`, unde T reprezintă tipul elementelor, iar N + reprezintă dimensiunea fixă cunoscută la momentul compilării. + + + Elemente individuale pot fi accesate cu ajutorul operatorului `[x]`, unde *x* este un + index *usize* (începând cu 0) al elementului pe care dorești să îl accesezi. + + + Colecțiile cu dimensiune dinamică, deseori numite array-uri dinamice sau variabile, vă + vor fi prezentate într-un capitol viitor numit **Vectori**. +- title: Funcții + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20add(x%3A%20i32%2C%20y%3A%20i32)%20-%3E%20i32%20%7B%0A%20%20%20%20return%20x%20%2B%20y%3B%0A%7D%0A%0Afn%20subtract(x%3A%20i32%2C%20y%3A%20i32)%20-%3E%20i32%20%7B%0A%20%20%20%20x%20-%20y%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20println!(%2242%20%2B%2013%20%3D%20%7B%7D%22%2C%20add(42%2C%2013))%3B%0A%20%20%20%20println!(%2242%20-%2013%20%3D%20%7B%7D%22%2C%20subtract(42%2C%2013))%3B%0A%7D%0A + content_markdown: > + O funcție admite mai multe argumente sau deloc. + + + În acest exemplu, funcția *add* admite două argumente de tip `i32` + (signed integer cu dimensiune de 32 de biți). + + + Dacă vreți să returnați o valoare sau expresie, puteți folosi cuvântul cheie `return` + și punct și virgula la final, așa cum am făcut în funcția *subtract*. + + + Numele funcțiilor sunt mereu scrise în format `snake_case`. + + + Hint: dacă definiți o funcție, datele pe care le admite se numesc parametrii. + Dacă folosiți o funcție și îi transmiteți niște date, atunci ele se numesc argumente. +- title: Returnarea mai multor valori + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20swap(x%3A%20i32%2C%20y%3A%20i32)%20-%3E%20(i32%2C%20i32)%20%7B%0A%20%20%20%20return%20(y%2C%20x)%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20return%20a%20tuple%20of%20return%20values%0A%20%20%20%20let%20result%20%3D%20swap(123%2C%20321)%3B%0A%20%20%20%20println!(%22%7B%7D%20%7B%7D%22%2C%20result.0%2C%20result.1)%3B%0A%0A%20%20%20%20%2F%2F%20destructure%20the%20tuple%20into%20two%20variables%20names%0A%20%20%20%20let%20(a%2C%20b)%20%3D%20swap(result.0%2C%20result.1)%3B%0A%20%20%20%20println!(%22%7B%7D%20%7B%7D%22%2C%20a%2C%20b)%3B%0A%7D%0A + content_markdown: > + Funcțiile pot returna mai multe valori prin returnarea unui **tuplu** (tuple) + + de valori. + + + Elementele unui tuplu pot fi accesate folosind indexul acestora. (ex: my_tuple.0) + + + Rust suportă diferite tipuri de destructurări pe care le vom vedea în multe contexte, + permințându-ne + + să extragem fracțiuni ale unor structuri de date în moduri ingenioase. Fiți pe fază! +- title: Returnarea + content_markdown: > + Dacă pentru o funcție nu se specifică ce tip returnează, aceasta va returna un tuplu gol, + cunoscut și sub numele de *unitate* (unit). + + + Un tuplu gol este reprezentat de `()`. + + + Folosirea unui `()` nu este des întâlnită, dar va apărea de suficiente ori, deci este bine să știți + ce se întâmplă. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20make_nothing()%20-%3E%20()%20%7B%0A%20%20%20%20return%20()%3B%0A%7D%0A%0A%2F%2F%20the%20return%20type%20is%20implied%20as%20()%0Afn%20make_nothing2()%20%7B%0A%20%20%20%20%2F%2F%20this%20function%20will%20return%20()%20if%20nothing%20is%20specified%20to%20return%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20a%20%3D%20make_nothing()%3B%0A%20%20%20%20let%20b%20%3D%20make_nothing2()%3B%0A%0A%20%20%20%20%2F%2F%20Printing%20a%20debug%20string%20for%20a%20and%20b%0A%20%20%20%20%2F%2F%20Because%20it's%20hard%20to%20print%20nothingness%0A%20%20%20%20println!(%22The%20value%20of%20a%3A%20%7B%3A%3F%7D%22%2C%20a)%3B%0A%20%20%20%20println!(%22The%20value%20of%20b%3A%20%7B%3A%3F%7D%22%2C%20b)%3B%0A%7D%0A +- title: Capitolul 1 - Încheiere + content_markdown: > + Până acu', e bine! Bazele Rust-ului nu sunt așa de rele, nu-i așa? Am + + aruncat o privire modului în care gândește compilatorul de Rust. Fiind un limbaj de programare + pentru sisteme + + acesta ține mult la dimensiunea valorilor în memorie, fie că pot fi + modificate sau nu, + + și la corectitudinea matematicii pe care o aplicați. În cele ce urmează, ne vom + întâlni cu niște vechi prieteni: + + teste `if` și bucle `for`. + + + Mai multe resurse: + + + * [Youtube: Rust Cast - A deeper dive on Rust's primitive number + types](https://www.youtube.com/watch?v=n5TRBkbystY) + + * [Website: Rust Book 2018 - A deeper description on basic data + types](https://doc.rust-lang.org/1.30.0/book/2018-edition/ch03-02-data-types.html) + + * [Website: Rust Cheat Sheet - Data Types](https://cheats.rs/#basic-types) diff --git a/lessons/ro/chapter_2.yaml b/lessons/ro/chapter_2.yaml new file mode 100644 index 000000000..6eae29489 --- /dev/null +++ b/lessons/ro/chapter_2.yaml @@ -0,0 +1,132 @@ +- title: Capitolul 2 - Controlul Basic al Flow-ului + content_markdown: > + În acest capitol vom vorbi despre metodele de control de bază ale fluxului în Rust. + + Dacă sunteți familiar cu limbaje bazate pe C, o să vă simțiți ca acasă și + poate + + vă veți bucura de o surpriză sau două. +- title: if/else + content_markdown: > + Ramificarea codului în Rust nu este surprinzătoare. + + + Condițiile nu au nevoie de paranteze! Am avut vreodată de fapt nevoie de ele? Logica noastră + poate arăta acum frumos și curat. + + + În rest, toți operatorii relaționali și logici funcționează la fel: `==`, `!=`, `<`, + `>`, `<=`, `>=`, `!`, `||`, `&&`. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20x%20%3D%2042%3B%0A%20%20%20%20if%20x%20%3C%2042%20%7B%0A%20%20%20%20%20%20%20%20println!(%22mai%20pu%C8%9Bin%20de%2042%22)%3B%0A%20%20%20%20%7D%20else%20if%20x%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20println!(%22egal%20cu%2042%22)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20println!(%22mare%20mare%20de%2042%22)%3B%0A%20%20%20%20%7D%0A%7D +- title: Bucle + content_markdown: | + Aveți nevoie de o buclă infinită? + + Rust face asta într-un mod foarte simplu. + + `break` vă va arunca în afara buclei când sunteți pregătit. + + `loop` are un secret despre care vom vorbi curând. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20mut%20x%20%3D%200%3B%0A%20%20%20%20loop%20%7B%0A%20%20%20%20%20%20%20%20x%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20if%20x%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%7D%0A +- title: while + content_markdown: | + `while` vă lasă să adăugați o condiție logică unei bucle. + + Dacă condiția impusă buclei devine falsă, bucla se va termina. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20mut%20x%20%3D%200%3B%0A%20%20%20%20while%20x%20!%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20x%20%2B%3D%201%3B%0A%20%20%20%20%7D%0A%20%20%20%20println!(%22x%20este%20%7B%7D%22%2C%20x)%3B%0A%7D%0A +- title: for + content_markdown: > + Bucla `for` din Rust e o îmbunătățire importantă. Ea + + iterează prin valorile oricărei expresii care poate fi transformată într-un iterator. + Ce este + + un iterator, vă întrebați? Un iterator este un obiect pe care îl puteți întreba "Care este + + următorul element pe care îl ai?" până când acesta nu mai are elemente. + + + Vom explora acest lucru într-un capitol viitor. Între timp, țineți minte că Rust + poate + + creea ușor iteratori care generează o secvență de numere întregi. + + + Operatorul `..` creează un iterator care generează numere de la un + număr pâna la + + alt număr, fără să îl includă pe cel din urmă. + + + Operatorul `..=` creează un iterator care generează numere de la un + număr pâna la + + alt număr, inclusiv cel din urmă. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20for%20x%20in%200..5%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20for%20x%20in%200..%3D5%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20x)%3B%0A%20%20%20%20%7D%0A%7D%0A +- title: match + content_markdown: > + Vă lipsește `switch`-ul din C? Rust are un cuvânt cheie incredibil de folositor + + pentru îndeplinirea tuturor posibilităților unei valori și executarea unei bucăți de cod dacă + o anumită + + posibilitate este adevărată. Hai să vedem cum merge asta pentru numere. Avem de discutat mai + multe + + în capitolele viitoare despre potrivirea șabloanelor (*pattern matching*) pentru date mai complexe. Vă promit că + o să + + merite așteptarea. + + + `match` este exhaustiv, deci toate cazurile + + trebuie să fie abordate și implementate. + + + Matching combinat cu destructurarea datelor este de departe unul din + + cele mai întâlnite șabloane de programare pe care le veți vedea în Rust. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20x%20%3D%2042%3B%0A%0A%20%20%20%20match%20x%20%7B%0A%20%20%20%20%20%20%20%200%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println!(%22am%20g%C4%83sit%20zero%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20putem%20face%20un%20caz%20pentru%20mai%20multe%20valori%0A%20%20%20%20%20%20%20%201%20%7C%202%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println!(%22am%20g%C4%83sit%201%20sau%202!%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20putem%20face%20un%20caz%20pentru%20o%20mul%C8%9Bime%0A%20%20%20%20%20%20%20%203..%3D9%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println!(%22am%20g%C4%83sit%20un%20num%C4%83r%20%C3%AEntre%203%20%C8%99i%209%20inclusiv%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20putem%20pune%20num%C4%83rul%20care%20respect%C4%83%20cazul%20%C3%AEntr-o%20variabil%C4%83%0A%20%20%20%20%20%20%20%20matched_num%20%40%2010..%3D100%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println!(%22am%20g%C4%83sit%20num%C4%83rul%20%7B%7D%20%C3%AEntre%2010%20%C8%99i%20100!%22%2C%20matched_num)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20acesta%20este%20cazul%20default%20care%20trebuie%20s%C4%83%20existe%20dac%C4%83%0A%20%20%20%20%20%20%20%20%2F%2F%20nu%20sunt%20abordate%20toate%20cazurile%20posibile%0A%20%20%20%20%20%20%20%20_%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println!(%22am%20g%C4%83sit%20alt%20num%C4%83r!%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A +- title: Returnarea unor valori dintr-o bucla + content_markdown: | + `loop` poate fi oprit pentru a returna o valoare. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20mut%20x%20%3D%200%3B%0A%20%20%20%20let%20v%20%3D%20loop%20%7B%0A%20%20%20%20%20%20%20%20x%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20if%20x%20%3D%3D%2013%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%20%22am%20g%C4%83sit%2013%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22din%20bucl%C4%83%3A%20%7B%7D%22%2C%20v)%3B%0A%7D%0A +- title: Returnarea unor valori din expresii bloc + content_markdown: > + `if`-urile, `match`-urile, funcțiile și domeniile bloc au un mod unic de + a returna valori în Rust. + + + Dacă ultima instrucțiune din interiorul unui/unei `if`, `match`, funcții sau domeniu bloc este o + expresie fără + + `;`, Rust o va returna sub forma unei valori din acel bloc. Acesta + + este un mod foarte bun de a creea logică concisă care returnează o valoare care poate fi pusă + într-o + + variabilă nouă. + + + Observăm cum acest lucru permite unui `if` să funcționeze ca operatorul ternar concis. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20example()%20-%3E%20i32%20%7B%0A%20%20%20%20let%20x%20%3D%2042%3B%0A%20%20%20%20%2F%2F%20operatorul%20ternar%20din%20Rust%0A%20%20%20%20let%20v%20%3D%20if%20x%20%3C%2042%20%7B%20-1%20%7D%20else%20%7B%201%20%7D%3B%0A%20%20%20%20println!(%22din%20if%3A%20%7B%7D%22%2C%20v)%3B%0A%0A%20%20%20%20let%20food%20%3D%20%22hamburger%22%3B%0A%20%20%20%20let%20result%20%3D%20match%20food%20%7B%0A%20%20%20%20%20%20%20%20%22hotdog%22%20%3D%3E%20%22este%20un%20hotdog%22%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20observa%C8%9Bi%20c%C4%83%20acoladele%20sunt%20op%C8%9Bionale%20c%C3%A2nd%20exist%C4%83%0A%20%20%20%20%20%20%20%20%2F%2F%20o%20expresie%20simpl%C4%83%20de%20returnare%0A%20%20%20%20%20%20%20%20_%20%3D%3E%20%22nu%20este%20un%20hotdog%22%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22tipul%20de%20m%C3%A2ncare%3A%20%7B%7D%22%2C%20result)%3B%0A%0A%20%20%20%20let%20v%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Acest%20scope%20block%20ne%20permite%20s%C4%83%20nu%20polu%C4%83m%20spa%C8%9Biul%20func%C8%9Biilor%0A%20%20%20%20%20%20%20%20let%20a%20%3D%201%3B%0A%20%20%20%20%20%20%20%20let%20b%20%3D%202%3B%0A%20%20%20%20%20%20%20%20a%20%2B%20b%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22din%20bloc%3A%20%7B%7D%22%2C%20v)%3B%0A%0A%20%20%20%20%2F%2F%20Modul%20idiomatic%20de%20a%20returna%20o%20valoare%20%C3%AEn%20Rust%20la%20sf%C3%A2%C8%99itul%20unei%20func%C8%9Bii%0A%20%20%20%20v%20%2B%204%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20println!(%22din%20func%C8%9Bie%3A%20%7B%7D%22%2C%20example())%3B%0A%7D%0A +- title: Capitolul 2 - Incheiere + content_markdown: > + Sper că v-am arătat o părticică din puterea Rust-ului chiar și prin cele mai + + simple caracteristici ale unui limbaj de programare. Vom vorbi despre `for` și + + `match` și mai profund pe măsură ce acumulăm mai multe cunoștințe care + + ne pot ajuta să ne folosim de capabilitățile lor. În cele ce urmează o să aruncăm o privire peste structurile + de date fundamentale + + din Rust. diff --git a/lessons/ro/chapter_3.yaml b/lessons/ro/chapter_3.yaml new file mode 100644 index 000000000..2e767df9d --- /dev/null +++ b/lessons/ro/chapter_3.yaml @@ -0,0 +1,156 @@ +- title: Capitolul 3 - Tipuri de structuri de date basic + content_markdown: > + Este timpul să explorăm tipuri de date dincolo de cele de bază! În acest capitol o să aruncăm o privire peste + structurile de date + + primitive din Rust, punând accent pe reprezentarea lor în + memorie. Cred + + c-o să vă placă cum Rust ascunde foarte puține despre cum funcționează lucrurile. +- title: Structuri + content_markdown: > + Un `struct` este o colecție de câmpuri (field-uri). + + + *Câmpurile* sunt pe scurt date asociate unei structuri. Valorile lor + pot fi de tip primitiv sau o structură de date. + + + Definiția structurii este ca o matriță pentru compilator pentru a ști cum să aranjeze + câmpurile în memorie într-un mod compact. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20SeaCreature%20%7B%0A%20%20%20%20%2F%2F%20String%20este%20un%20struct%0A%20%20%20%20animal_type%3A%20String%2C%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20arms%3A%20i32%2C%0A%20%20%20%20legs%3A%20i32%2C%0A%20%20%20%20weapon%3A%20String%2C%0A%7D +- title: Apelarea metodelor + content_markdown: > + Spre deosebire de funcții, metodele sunt funcții asociate unui tip specific + de date. + + + **metode statice** — metode care aparțin unui tip de date și sunt apelate folosind + operatorul `::`. + + + **metode ale instanței** — metode care aparțin unei instanțe a unui tip de date și sunt + apelate folosind operatorul `.`. + + + Vom dezvolta acest concept cu implementarea propriilor metode în capitole viitoare. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20%2F%2F%20Folosim%20o%20metod%C4%83%20static%C4%83%20ca%20s%C4%83%20creem%20o%20instan%C8%9B%C4%83%20String%0A%20%20%20%20let%20s%20%3D%20String%3A%3Afrom(%22Hello%20world!%22)%3B%0A%20%20%20%20%2F%2F%20Folosim%20o%20metod%C4%83%20a%20instan%C8%9Bei%0A%20%20%20%20println!(%22%7B%7D%20is%20%7B%7D%20characters%20long.%22%2C%20s%2C%20s.len())%3B%0A%7D%0A +- title: Memorie + content_markdown: > + Aplicațiile scrise în Rust au 3 zone de memorie unde este stocată informație: + + * **memoria pentru date** - pentru date care sunt de dimensiune fixă și sunt **statice** (ex: + mereu disponibile pe toată durata rulării aplicației). + Spre exemplu, textul din programul tău (ex: "Hello World!"): Memoria ocupată (bytes) de acest text este citită dintr-un singur loc în cod + deci poate fi stocat în această zonă de memorie. Compilatoarele fac o groază de optimizări + pentru acest tip de date și folosirea lor în general este considerată foarte rapidă, pentru că + locația lor este cunoscută și fixă. + * **memoria pentru stivă (stack)** - pentru date declarate ca variabile în interiorul unei + funcții. + Locația în memorie a acestor date nu se schimbă pe durata apelului funcției; datorită acestui lucru compilatoarele + pot optimiza codul astfel încât datele din stivă se accesează foarte rapid. + * **memoria pentru alocare dinamică (heap)** - pentru informație care este creată în timp ce aplicația + rulează. + Datele în această zonă de memorie pot fi adăugate, mutate, șterse, redimensionate, etc. Din cauza + naturii sale dinamice, este în general considerată mai lentă, dar această zonă permite + utilizări mult mai creative ale memoriei. Când adăugăm date în această zonă de memorie, + numim această operație **alocare (de memorie)**. Când eliberăm date din această zonă de memorie, numim această operație + **dealocare (de memorie)**. +- title: Crearea datelor în Memorie + content_markdown: > + Când **instanțiem** o **structură** în codul nostru, aplicația creează + câmpurile de date unul lângă altul în memorie. + + + Instanțiem o structură specificând toate valorile câmpurilor în interiorul + + + `StructName { ... }`. + + + Câmpurile unei structuri sunt accesate folosind operatorul `.`. + + + Detalii despre memorie în exemplul nostru: + + * Textul din interiorul ghilimelelor este informație read-only (ex: "Ferris"), deci acesta + este + pus în zona *memoriei pentru date*. + * Apelul funcției `String::from` creează o structură de tip `String` care este pus + unul + lângă altul cu toate câmpurile structurii SeaCreature în *stivă*. Un String reprezintă text care poate fi modificat + și face acest lucru prin intermediul următoarelor aspecte: + 1. Alocă memorie pe *heap* pentru text unde va putea fi modificat + 2. Stochează o referință la acea locație de pe *heap* în structura `String` + (Mai multe despre acest concept în următoarele lecții) + * Așadar, cei doi prieteni ai noștri, *Ferris* și *Sarah*, sunt date care + vor avea mereu + valori fixe în aplicația noastră, deci vor fi puși în *stivă*. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20SeaCreature%20%7B%0A%20%20%20%20animal_type%3A%20String%2C%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20arms%3A%20i32%2C%0A%20%20%20%20legs%3A%20i32%2C%0A%20%20%20%20weapon%3A%20String%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20datele%20din%20SeaCreature%20sunt%20pe%20stiv%C4%83%0A%20%20%20%20let%20ferris%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Struct-ul%20String%20este%20de%20asemenea%20pe%20stiv%C4%83%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20dar%20%C8%9Bine%20o%20referin%C8%9B%C4%83%20a%20informa%C8%9Biei%20pe%20heap%0A%20%20%20%20%20%20%20%20animal_type%3A%20String%3A%3Afrom(%22crab%22)%2C%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20arms%3A%202%2C%0A%20%20%20%20%20%20%20%20legs%3A%204%2C%0A%20%20%20%20%20%20%20%20weapon%3A%20String%3A%3Afrom(%22ghiar%C4%83%22)%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20let%20sarah%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20animal_type%3A%20String%3A%3Afrom(%22caracati%C8%9B%C4%83%22)%2C%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Sarah%22)%2C%0A%20%20%20%20%20%20%20%20arms%3A%208%2C%0A%20%20%20%20%20%20%20%20legs%3A%200%2C%0A%20%20%20%20%20%20%20%20weapon%3A%20String%3A%3Afrom(%22creier%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22%7B%7D%20este%20%7B%7D.%20Are%20%7B%7D%20m%C3%A2ini%2C%20%7B%7D%20picioare%2C%20%C8%99i%20%7B%7D%20pe%20post%20de%20arm%C4%83%22%2C%0A%20%20%20%20%20%20%20%20ferris.name%2C%20ferris.animal_type%2C%20ferris.arms%2C%20ferris.legs%2C%20ferris.weapon%0A%20%20%20%20)%3B%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22%7B%7D%20este%20%7B%7D.%20Are%20%7B%7D%20m%C3%A2ini%2C%20%7B%7D%20picioare.%20Nu%20are%20nicio%20arm%C4%83..%22%2C%0A%20%20%20%20%20%20%20%20sarah.name%2C%20sarah.animal_type%2C%20sarah.arms%2C%20sarah.legs%0A%20%20%20%20)%3B%0A%7D%0A +- title: Structuri asemănătoare tuplurilor + content_markdown: | + Pentru a fi conciși, puteți creea structuri care sunt folosite asemănător unor tupluri. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Location(i32%2C%20i32)%3B%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20Acesta%20este%20tot%20un%20struct%20pe%20stiv%C4%83%0A%20%20%20%20let%20loc%20%3D%20Location(42%2C%2032)%3B%0A%20%20%20%20println!(%22%7B%7D%2C%20%7B%7D%22%2C%20loc.0%2C%20loc.1)%3B%0A%7D%0A +- title: Structuri asemănătoare unităților + content_markdown: > + Structurile nu trebuie neapărat să aibă câmpuri. + + + După cum am menționat în Capitolul 1, *unitate* este o altă denumire pentru un tuplu gol, `()`. + De aceea, acest tip de structuri se numește *Unit-like*. + + + Acest tip de structuri este folosit rar. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Marker%3B%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20_m%20%3D%20Marker%3B%0A%7D%0A +- title: Enumerații + content_markdown: > + Enumerațiile vă permit să creați un tip nou de date care poate avea o valoare dintr-o + mulțime de elemente prestabilite folosind cuvântul cheie `enum`. + + + `match` ne ajută să abordăm toate valorile posibile ale unei enumerații, făcând din acest tip + o unealtă importantă în ceea ce privește scrierea codului de calitate. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%23!%5Ballow(dead_code)%5D%20%2F%2F%20aceast%C4%83%20linie%20opre%C8%99te%20avertiz%C4%83rile%20compilatorului%0A%0Aenum%20Species%20%7B%0A%20%20%20%20Crab%2C%0A%20%20%20%20Octopus%2C%0A%20%20%20%20Fish%2C%0A%20%20%20%20Clam%0A%7D%0A%0Astruct%20SeaCreature%20%7B%0A%20%20%20%20species%3A%20Species%2C%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20arms%3A%20i32%2C%0A%20%20%20%20legs%3A%20i32%2C%0A%20%20%20%20weapon%3A%20String%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20ferris%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20species%3A%20Species%3A%3ACrab%2C%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20arms%3A%202%2C%0A%20%20%20%20%20%20%20%20legs%3A%204%2C%0A%20%20%20%20%20%20%20%20weapon%3A%20String%3A%3Afrom(%22ghiar%C4%83%22)%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20match%20ferris.species%20%7B%0A%20%20%20%20%20%20%20%20Species%3A%3ACrab%20%3D%3E%20println!(%22%7B%7D%20este%20crab%22%2Cferris.name)%2C%0A%20%20%20%20%20%20%20%20Species%3A%3AOctopus%20%3D%3E%20println!(%22%7B%7D%20este%20caracati%C8%9B%C4%83%22%2Cferris.name)%2C%0A%20%20%20%20%20%20%20%20Species%3A%3AFish%20%3D%3E%20println!(%22%7B%7D%20este%20pe%C8%99te%22%2Cferris.name)%2C%0A%20%20%20%20%20%20%20%20Species%3A%3AClam%20%3D%3E%20println!(%22%7B%7D%20este%20scoic%C4%83%22%2Cferris.name)%2C%0A%20%20%20%20%7D%0A%7D%0A +- title: Enumerațiile care conțin tipuri de Date + content_markdown: > + Elementele unui `enum` pot avea de asemenea unul sau mai multe tipuri de date, permițându-i acestuia să se comporte + ca un *union* din limbajul C. + + + Atunci când un `enum` este utilizat într-un `match`, puteți lega un nume de variabilă + la fiecare valoare din `enum`. + + + Detalii despre memorie pentru un `enum`: + + * O variabilă egalată cu o valoare provenită dintr-o enumerație va avea dimensiunea în memorie egală cu cea a elementului care ocupă dimensiunea maximă + Acest lucru asigură faptul că orice valoare posibilă va încăpea în aceeași dimensiune din memorie. + + * Pe lângă tipul de date al unui element (dacă acesta are un tip), fiecare element are de asemenea asociată + o valoare numerică care reprezintă indexul acestuia în enumerație. + + + Alte detalii: + + * `enum`-ul din Rust este cunoscut și ca *uniune etichetată* (tagged union). + + * Combinarea mai multor tipuri de date pentru a creea unul nou este ceea ce îi face pe oameni + să afirme faptul că Rust are *tipuri algebrice*. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%23!%5Ballow(dead_code)%5D%20%2F%2F%20aceast%C4%83%20linie%20opre%C8%99te%20avertiz%C4%83rile%20compilatorului%0A%0Aenum%20Species%20%7B%20Crab%2C%20Octopus%2C%20Fish%2C%20Clam%20%7D%0Aenum%20PoisonType%20%7B%20Acidic%2C%20Painful%2C%20Lethal%20%7D%0Aenum%20Size%20%7B%20Big%2C%20Small%20%7D%0Aenum%20Weapon%20%7B%0A%20%20%20%20Claw(i32%2C%20Size)%2C%0A%20%20%20%20Poison(PoisonType)%2C%0A%20%20%20%20None%0A%7D%0A%0Astruct%20SeaCreature%20%7B%0A%20%20%20%20species%3A%20Species%2C%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20arms%3A%20i32%2C%0A%20%20%20%20legs%3A%20i32%2C%0A%20%20%20%20weapon%3A%20Weapon%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20datele%20din%20SeaCreature%20sunt%20pe%20stiv%C4%83%0A%20%20%20%20let%20ferris%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Struct-ul%20String%20este%20de%20asemenea%20pe%20stiv%C4%83%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20dar%20%C8%9Bine%20o%20referin%C8%9B%C4%83%20a%20informa%C8%9Biei%20pe%20heap%0A%20%20%20%20%20%20%20%20species%3A%20Species%3A%3ACrab%2C%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20arms%3A%202%2C%0A%20%20%20%20%20%20%20%20legs%3A%204%2C%0A%20%20%20%20%20%20%20%20weapon%3A%20Weapon%3A%3AClaw(2%2C%20Size%3A%3ASmall)%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20match%20ferris.species%20%7B%0A%20%20%20%20%20%20%20%20Species%3A%3ACrab%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20match%20ferris.weapon%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Weapon%3A%3AClaw(num_claws%2Csize)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20size_description%20%3D%20match%20size%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Size%3A%3ABig%20%3D%3E%20%22mari%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Size%3A%3ASmall%20%3D%3E%20%22mici%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20println!(%22ferris%20este%20un%20crab%20cu%20%7B%7D%20ghiare%20%7B%7D%22%2C%20num_claws%2C%20size_description)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%3E%20println!(%22ferris%20este%20un%20crab%20cu%20alte%20arme%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20_%20%3D%3E%20println!(%22ferris%20este%20alt%20animal%22)%2C%0A%20%20%20%20%7D%0A%7D +- title: Capitolul 3 - Încheiere + content_markdown: > + Ce palpitant! Acum avem în sfârșit toate uneltele de bază pentru a reprezenta + ideile noastre în cod. Sper că acum + + putem vedea puțin din cum operațiile fundamentale din Rust funcționează armonios și în mod + concis cu tipurile sale de date. În cele ce urmează o să vorbim despre + + un concept care atribuie tipurilor noastre de date și mai multă flexibilitate în reprezentare: + *genericitate* (generics). diff --git a/lessons/ro/chapter_4.yaml b/lessons/ro/chapter_4.yaml new file mode 100644 index 000000000..ee75ea961 --- /dev/null +++ b/lessons/ro/chapter_4.yaml @@ -0,0 +1,223 @@ +- title: Capitolul 4 - Tipuri generice + content_markdown: > + Tipurile generice sunt incredibil de importante în Rust. Sunt folosite pentru a + reprezenta + + valori care pot fi nule (ex: variabile care poate nu au încă o valoare), abordarea + erorilor, + + colecții și multe altele! În această secțiune vom învăța despre + tipurile generice fundamentale + + pe care le veți folosi în majoritatea timpului. +- title: Ce sunt tipurile generice? + content_markdown: > + Tipurile generice ne lasă să definim parțial un `struct` sau un `enum`, permițând + compiler-ului să creeze o versiune definită complet + + versiune definită complet la momentul compilării bazată pe modul în care am folosit codul. + + + În general, Rust poate deduce tipul final analizând instanțierea noastră, dar + dacă are nevoie de ajutor, + + puteți oricând să instanțiați explicit folosind operatorul `::`, cunoscut sub numele de + `turbofish` (e un bun prieten de-ai mei!). + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%2F%2F%20Un%20tip%20de%20struct%20definit%20par%C8%9Bial%0Astruct%20BagOfHolding%3CT%3E%20%7B%0A%20%20%20%20item%3A%20T%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20Observa%C8%9Bi%3A%20folosind%20tipuri%20generice%2C%20gener%C4%83m%20tipuri%20create%20la%20momentul%20compil%C4%83rii%0A%20%20%20%20%2F%2F%20Turbofish%20ne%20las%C4%83%20s%C4%83%20fim%20explici%C8%9Bi%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%2042%20%7D%3B%0A%20%20%20%20let%20bool_bag%20%3D%20BagOfHolding%3A%3A%3Cbool%3E%20%7B%20item%3A%20true%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20Rust%20poate%20deduce%20tipuri%20%C8%99i%20pentru%20cele%20generice!%0A%20%20%20%20let%20float_bag%20%3D%20BagOfHolding%20%7B%20item%3A%203.14%20%7D%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20Aten%C8%9Bie%3A%20nu%20pune%C8%9Bi%20niciodat%C4%83%20o%20geant%C4%83%20%C3%AEn%20alt%C4%83%20geant%C4%83%20%C3%AEn%20via%C8%9Ba%20real%C4%83%0A%20%20%20%20let%20bag_in_bag%20%3D%20BagOfHolding%20%7B%0A%20%20%20%20%20%20%20%20item%3A%20BagOfHolding%20%7B%20item%3A%20%22boom!%22%20%7D%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20println!(%0A%20%20%20%20%20%20%20%20%22%7B%7D%20%7B%7D%20%7B%7D%20%7B%7D%22%2C%0A%20%20%20%20%20%20%20%20i32_bag.item%2C%20bool_bag.item%2C%20float_bag.item%2C%20bag_in_bag.item.item%0A%20%20%20%20)%3B%0A%7D%0A +- title: Reprezentarea nimicului + content_markdown: > + În alte limbaje, cuvântul cheie `null` este folosit pentru a reprezenta absența unei + valori. El creează + + dificultăți în limbajele de programare, pentru că este posibil ca aplicația noastră + să eșueze + + când interacționează cu o variabilă sau un field de acest tip. + + + Rust nu are tipul `null`, dar nu este ignorant când vine vorba de importanța + reprezentării nimicului! + + Gândiți-vă la o reprezentare naivă folosind o unealtă pe care o cunoaștem deja. + + + Alternativa `None` (ex: match) pentru una sau + mai multe valori care pot varia este așa de + + des întâlnită în Rust din cauza lipsei unei valori `null`. Tipurile generice ne ajută însă + să trecem de acest obstacol. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=enum%20Item%20%7B%0A%20%20%20%20Inventory(String)%2C%0A%20%20%20%20%2F%2F%20None%20reprezint%C4%83%20absen%C8%9Ba%20unui%20element%0A%20%20%20%20None%2C%0A%7D%0A%0Astruct%20BagOfHolding%20%7B%0A%20%20%20%20item%3A%20Item%2C%0A%7D%0A +- title: Option + content_markdown: > + Rust are un enum deja implementat numit `Option` care ne permite să reprezentăm + valori care pot fi nule (nullable) + + fără să folosim `null`. + + + ``` + + enum Option { + None, + Some(T), + } + + ``` + + + Acest enum este foarte comun, instanțe ale acestui enum pot fi create oriunde prin intermediul + elementelor din enum `Some` și `None`. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=%2F%2F%20Un%20tip%20de%20struct%20definit%20par%C8%9Bial%0Astruct%20BagOfHolding%3CT%3E%20%7B%0A%20%20%20%20%2F%2F%20Tipul%20de%20parametru%20T%20poate%20fi%20folosit%20din%20Option%0A%20%20%20%20item%3A%20Option%3CT%3E%2C%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20Observa%C8%9Bi%3A%20O%20geant%C4%83%20pentru%20i32%2C%20care%20nu%20con%C8%9Bine%20nimic!%20Trebuie%20s%C4%83%0A%20%20%20%20%2F%2F%20specific%C4%83m%20tipul%2C%20altfel%20Rust%20nu%20va%20%C8%99ti%20ce%20tip%20poate%20%C8%9Bine%20geanta%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%20None%20%7D%3B%0A%0A%20%20%20%20if%20i32_bag.item.is_none()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22nu%20este%20nimic%20%C3%AEn%20geant%C4%83!%22)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20println!(%22se%20afl%C4%83%20ceva%20%C3%AEn%20geant%C4%83!%22)%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20i32_bag%20%3D%20BagOfHolding%3A%3A%3Ci32%3E%20%7B%20item%3A%20Some(42)%20%7D%3B%0A%0A%20%20%20%20if%20i32_bag.item.is_some()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22se%20afl%C4%83%20ceva%20%C3%AEn%20geant%C4%83!%22)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20println!(%22nu%20este%20nimic%20%C3%AEn%20geant%C4%83!%22)%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20match%20ne%20permite%20s%C4%83%20destructur%C4%83m%20Option%20%C3%AEn%20mod%20elegant%20pentru%0A%20%20%20%20%2F%2F%20a%20gestiona%20toate%20cazurile%20posibile!%0A%20%20%20%20match%20i32_bag.item%20%7B%0A%20%20%20%20%20%20%20%20Some(v)%20%3D%3E%20println!(%22g%C4%83sit%20%7B%7D%20%C3%AEn%20geant%C4%83!%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20None%20%3D%3E%20println!(%22nu%20a%20fost%20g%C4%83sit%20nimic%22)%2C%0A%20%20%20%20%7D%0A%7D%0A +- title: Result + content_markdown: > + Rust are un enum deja implementat numit `Result` care ne permite să returnăm + o valoare care poate eșua în cadrul unei instrucțiuni. + + Este modalitatea idiomatică în care limbajul Rust tratează posibilele erori. + + + ``` + + enum Result { + Ok(T), + Err(E), + } + + ``` + + + Observăm ca aceste tipuri generice au multiple *tipuri parametrizate* separate de + o virgulă. + + + Acest `enum` este foarte comun, instanțe ale acestui enum pot fi create oriunde prin intermediul + elementelor din enum `Ok` și `Err`. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3Ai32)%20-%3E%20Result%3Cf32%2CString%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22acesta%20nu%20este%20num%C4%83rul%20corect%22))%20%20%20%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20result%20%3D%20do_something_that_might_fail(12)%3B%0A%0A%20%20%20%20%2F%2F%20match%20ne%20permite%20s%C4%83%20destructur%C4%83m%20Result-ul%20%C3%AEntr-un%20mod%20elegant%0A%20%20%20%20%2F%2F%20ca%20s%C4%83%20gestion%C4%83m%20toate%20cazurile%20posibile%0A%20%20%20%20match%20result%20%7B%0A%20%20%20%20%20%20%20%20Ok(v)%20%3D%3E%20println!(%22g%C4%83sit%20%7B%7D%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20Err(e)%20%3D%3E%20println!(%22Eroare%3A%20%7B%7D%22%2Ce)%2C%0A%20%20%20%20%7D%0A%7D%0A +- title: Main-ul care poate eșua + content_markdown: | + `main` are capacitatea de a returna un `Result`! + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22acesta%20este%20num%C4%83rul%20corect%22))%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20MMain%20nu%20returneaz%C4%83%20nicio%20valoare%2C%20dar%20poate%20returna%20o%20eroare!%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20let%20result%20%3D%20do_something_that_might_fail(12)%3B%0A%0A%20%20%20%20match%20result%20%7B%0A%20%20%20%20%20%20%20%20Ok(v)%20%3D%3E%20println!(%22g%C4%83sit%20%7B%7D%22%2C%20v)%2C%0A%20%20%20%20%20%20%20%20Err(_e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20gestioneaz%C4%83%20aceast%C4%83%20eroare%20gra%C8%9Bios%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20returneaza%20o%20nou%C4%83%20eroare%20din%20main%20care%20explic%C4%83%20ce%20s-a%20%C3%AEntamplat!%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Err(String%3A%3Afrom(%22ceva%20nu%20a%20mers%20bine%20%C3%AEn%20main!%22))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Observa%C8%9Bi%20c%C4%83%20folosim%20o%20unitate%20%C3%AEn%20interiorul%20unui%20Result%20Ok%0A%20%20%20%20%2F%2F%20ca%20s%C4%83%20transmitem%20faptul%20c%C4%83%20totul%20a%20mers%20bine%0A%20%20%20%20Ok(())%0A%7D%0A +- title: Gestionare grațioasă a erorilor + content_markdown: > + `Result` e atât de des întâlnit încât Rust are un operator important, `?`, pentru a le + gestiona. Următoarele două afirmații sunt echivalente: + + + ``` + + do_something_that_might_fail()? + + ``` + + + ``` + + match do_something_that_might_fail() { + Ok(v) => v, + Err(e) => return Err(e), + } + + ``` + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22acesta%20nu%20este%20num%C4%83rul%20corect%22))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20%2F%2F%20Uita%C8%9Bi%20c%C3%A2t%20spa%C8%9Biu%20am%20salvat%20prin%20aceast%C4%83%20metod%C4%83%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(42)%3F%3B%0A%20%20%20%20println!(%22g%C4%83sit%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20Ok(())%0A%7D%0A +- title: Gestionarea inadecvată a `Option` / `Result` + content_markdown: > + Folosirea `Option` / `Result` poate fi obositoare când încerci doar să + scrii rapid niște cod. Și `Option`, și `Result` are o + + funcție numită `unwrap` care poate fi utilă pentru a primi o valoare rapid, + dar în mod periculos. `unwrap` va fi: + + 1. valoare din `Option` / `Result` + + 2. `panic!`, dacă enum-ul este de tip `None` / `Err` + + + Următoarele bucăți de cod sunt echivalente: + + + ``` + + my_option.unwrap() + + ``` + + + ``` + + match my_option { + Some(v) => v, + None => panic!("un mesaj de eroare generat de Rust!"), + } + + ``` + + + Analogie: + + + ``` + + my_result.unwrap() + + ``` + + + ``` + + match my_result { + Ok(v) => v, + Err(e) => panic!("un mesaj de eroare generat de Rust!"), + } + + ``` + + + Fiți un bun rustaceu și folosiți-vă de `match` când puteți face asta! + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20do_something_that_might_fail(i%3A%20i32)%20-%3E%20Result%3Cf32%2C%20String%3E%20%7B%0A%20%20%20%20if%20i%20%3D%3D%2042%20%7B%0A%20%20%20%20%20%20%20%20Ok(13.0)%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20Err(String%3A%3Afrom(%22acesta%20nu%20este%20num%C4%83rul%20corect%22))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20String%3E%20%7B%0A%20%20%20%20%2F%2F%20concis%2C%20dar%20este%20o%20presupunere%20%C8%99i%20poate%20fi%20periculos%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(42).unwrap()%3B%0A%20%20%20%20println!(%22g%C4%83sit%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20aceasta%20va%20returna%20panic!%0A%20%20%20%20let%20v%20%3D%20do_something_that_might_fail(1).unwrap()%3B%0A%20%20%20%20println!(%22g%C4%83sit%20%7B%7D%22%2C%20v)%3B%0A%20%20%20%20%0A%20%20%20%20Ok(())%0A%7D%0A +- title: Vectori + content_markdown: > + Unele din cele mai utile tipuri generice sunt colecțiile. Un vector este o + listă de dimensiune variabilă de elemente + + reprezentate de structura `Vec`. + + + Macro-ul `vec!` ne permite să creem ușor un vector mai degrabă decât + să construim manual unul. + + + `Vec` are metoda `iter()` care creează un iterator dintr-un vector, + fiind astfel foarte ușor să + + punem un vector în interiorul unei bucle `for`. + + + Detalii despre memorie: + + * `Vec` este un struct, dar intern el conține o referință la o listă cu capacitate fixă + ale elementelor sale pe heap + + * Un vector începe cu o capacitate implicită; când sunt adăugate mai multe elemente decât + poate conține, acesta + realocă elementele sale pe heap pentru a avea o nouă listă cu capacitate fixă mai mare. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20%2F%2F%20Putem%20fi%20explici%C8%9Bi%20cu%20privire%20la%20tip%0A%20%20%20%20let%20mut%20i32_vec%20%3D%20Vec%3A%3A%3Ci32%3E%3A%3Anew()%3B%20%2F%2F%20turbofish%20%3C3%0A%20%20%20%20i32_vec.push(1)%3B%0A%20%20%20%20i32_vec.push(2)%3B%0A%20%20%20%20i32_vec.push(3)%3B%0A%0A%20%20%20%20%2F%2F%20Rust%20este%20foarte%20inteligent%20c%C3%A2nd%20vine%20vorba%20de%20determinarea%20automat%C4%83%20a%20tipului%0A%20%20%20%20let%20mut%20float_vec%20%3D%20Vec%3A%3Anew()%3B%0A%20%20%20%20float_vec.push(1.3)%3B%0A%20%20%20%20float_vec.push(2.3)%3B%0A%20%20%20%20float_vec.push(3.4)%3B%0A%0A%20%20%20%20%2F%2F%20Este%20un%20macro%20superb!%0A%20%20%20%20let%20string_vec%20%3D%20vec!%5BString%3A%3Afrom(%22Hello%22)%2C%20String%3A%3Afrom(%22World%22)%5D%3B%0A%0A%20%20%20%20for%20word%20in%20string_vec.iter()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20word)%3B%0A%20%20%20%20%7D%0A%7D%0A +- title: Capitolul 4 - Incheiere + content_markdown: > + Într-un singur capitol, am învățat câtă putere ne oferă tipurile generice! Nu vă + îngrijorați dacă nu + + știți încă pe deplin cum să folosiți tot ce ați văzut în acest capitol, deocamdată este bine doar să fiți conștient + de aceste concepte majore pe care + + le veți vedea des în cod. Funcțiile noastre devin destul de lungi! În următorul + capitol vom + + vorbi despre un alt concept important în Rust: proprietatea datelor (data ownership).