From 1967e72d9a0139af1dcd7e366b81276254799933 Mon Sep 17 00:00:00 2001 From: tiberiugila Date: Fri, 19 Jan 2024 01:09:37 +0200 Subject: [PATCH 01/10] Translated Chapter 8 of Tour of Rust in Romanian --- .idea/.gitignore | 8 + .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/modules.xml | 8 + .idea/tour_of_rust.iml | 8 + .idea/vcs.xml | 6 + lessons/en/chapter_8.yaml | 16 +- lessons/ro/chapter_8.yaml | 324 +++++++++++++++++++ 7 files changed, 367 insertions(+), 9 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/tour_of_rust.iml create mode 100644 .idea/vcs.xml create mode 100644 lessons/ro/chapter_8.yaml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..03d9549ea --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..dd01c727f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/tour_of_rust.iml b/.idea/tour_of_rust.iml new file mode 100644 index 000000000..610219404 --- /dev/null +++ b/.idea/tour_of_rust.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lessons/en/chapter_8.yaml b/lessons/en/chapter_8.yaml index 79290ad46..238d99e9f 100644 --- a/lessons/en/chapter_8.yaml +++ b/lessons/en/chapter_8.yaml @@ -353,15 +353,13 @@ - title: Chapter 8 - Conclusion content_markdown: > - Smart pointers are the idioms of Rust programming and let us not have to - re-create the + Pointerii inteligenți sunt expresiile de programare Rust și ne permite să nu recreem + modele foarte comune de utilizare a memoriei. Cu ele sunteți gata să abordați + cel mai dificile - very common patterns of memory usage. With them you are ready to tackle the - toughest of + provocări! Acum că avem bazele Rust, hai să vorbim puțin despre + cum facem - challenges! Now that we have the foundations of Rust, let's talk a bit about - how we make + proiecte mai mari. În capitolul 9 ne eliberăm de o singură pagină de - larger projects. In chapter 9 we break free of single page - - lines of code. + linii de cod. diff --git a/lessons/ro/chapter_8.yaml b/lessons/ro/chapter_8.yaml new file mode 100644 index 000000000..27d1d336c --- /dev/null +++ b/lessons/ro/chapter_8.yaml @@ -0,0 +1,324 @@ +- title: Capitolul 8 - Pointerii inteligenti + content_markdown: > + + În acest capitol vom demistifica pointerii inteligenți. Să explorăm aceste structuri de date care ne permit + să interacționăm cu cel mai de jos nivel al memoriei. + + Ferris spune: "Nu te simți copleșit de acest capitol dacă nu simți că poți scrie propriul tău cod de gestionare + a memoriei la nivel scăzut într-o singură lectură scurtă. Acest capitol are în principal rolul de a te introduce + în unele instrumente utile și de a-ți oferi o privire asupra modului în care funcționează!" + +- title: Referințe revizuite + content_markdown: > + O referință este în principiu doar un număr care este poziția de început a unor octeți din memorie. + Singurul său scop este de a reprezenta conceptul unde există date de un anumit tip. + Ceea ce face o referință diferită de doar un număr este că Rust va valida durata de viață a referințelor nu durează + mai mult decât la care se referă (altfel am primi o eroare când am folosit-o!). + +- title: Pointeri bruți + content_markdown: > + Referințele pot fi convertite într-un tip mai primitiv numit indicator brut. La fel ca un număr, acesta poate fi + copiat și mutat cu puține restricții. Rust nu oferă nicio asigurare cu privire la validitatea locației de memorie către care indică. + + Există două tipuri de indicatori bruti: + + * `*const T` - Un indicator brut către date de tip T care nu ar trebui să se schimbe niciodată. + * `*mut T` - Un indicator brut către date de tip T care se pot modifica. + Indicatoarele brute pot fi convertite în și din numere (de exemplu, `usize`). + + Indicatorii bruti pot accesa datele cu cod nesigur (mai multe despre asta mai târziu). + + Detalii de memorie: + + * O referință în Rust este foarte asemănătoare cu un pointer în C în ceea ce privește utilizarea, dar cu mult mai multe + restricții de timp de compilare privind modul în care poate fi stocată și mutată în alte funcții. + * Un indicator brut din Rust este similar cu un indicator din C, deoarece reprezintă un număr care poate fi copiat sau + transmis și chiar transformat în tipuri numerice unde poate fi modificat ca număr pentru a face matematica indicatorului. + 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%2042%3B%0A%20%20%20%20let%20memory_location%20%3D%20%26a%20as%20*const%20i32%20as%20usize%3B%0A%20%20%20%20println!(%22Data%20is%20here%20%7B%7D%22%2C%20memory_location)%3B%0A%7D%0A + +- title: Dereferențierea + content_markdown: > + Procesul de accesare/manipulare a datelor la care se face referire printr-o referință (adică &i32) se numește dereferencing. + + Referințele sunt folosite pentru a accesa/manipula datele în două moduri: + + Accesul la datele menționate în timpul atribuirii variabilelor. + Acces la câmpuri sau metode ale datelor menționate. + Rust are niște operatori puternici care ne permit să facem acest lucru. + +- title: Operatorul * + content_markdown: > + Operatorul `*` este o modalitate explicită de a dereferi o referință. + + + ```rust + + let a: i32 = 42; + + let ref_ref_ref_a: &&&i32 = &&&a; + + let ref_a: &i32 = **ref_ref_ref_a; + + let b: i32 = *ref_a; + + ``` + + + Detaliu de memorie: + + - Deoarece i32 este un tip primitiv care implementează trăsătura „Copy”, + + octeții variabilei `a` de pe stivă sunt copiați în octeții variabilei + `b`. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20a%3A%20i32%20%3D%2042%3B%0A%20%20%20%20let%20ref_ref_ref_a%3A%20%26%26%26i32%20%3D%20%26%26%26a%3B%0A%20%20%20%20let%20ref_a%3A%20%26i32%20%3D%20**ref_ref_ref_a%3B%0A%20%20%20%20let%20b%3A%20i32%20%3D%20*ref_a%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20b)%0A%7D +- title: Operatorul . + content_markdown: > + Operatorul `.` este utilizat în accesarea câmpurilor și metodelor unei referințe. Acesta + funcționează puțin mai subtil. + + + + ```rust + + let f = Foo { value: 42 }; + + let ref_ref_ref_f = &&&f; + + println!("{}", ref_ref_ref_f.value); + + ``` + Woa, de ce nu a fost nevoie să adăugăm `***` înainte de `ref_ref_ref_f`? Aceasta este + deoarece operatorul `.` dereferențiază automat.Ultima linie este transformată automat în următoarea de către compilator. + + + ```rust + + println!("{}", (***ref_ref_ref_f).value); + + + ``` + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Foo%20%7B%0A%20%20%20%20value%3A%20i32%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20f%20%3D%20Foo%20%7B%20value%3A%2042%20%7D%3B%0A%20%20%20%20let%20ref_ref_ref_f%20%3D%20%26%26%26f%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20ref_ref_ref_f.value)%3B%0A%7D +- title: Pointerii inteligenti + content_markdown: > + În plus față de capacitatea de a crea referințe la datele tastate existente folosind + operatorul `&`, Rust ne oferă capacitatea + + pentru a crea structuri * reference-like * referințe numite ** pointeri inteligenti **. + + + Ne putem gândi la referințe la un nivel înalt ca la un tip care ne oferă acces la + alt tip. Indicatoarele inteligente sunt diferite în ceea ce privește + + comportamentul de la referințe normale prin faptul că acestea funcționează pe baza logicii interne + pe care le scrie un programator. Tu — programatorul — esti partea *inteligentă*. + + + În mod obișnuit, pointerii inteligenti implementează trăsăturile „Deref”, „DerefMut” și „Drop” la + specificați logica a ceea ce ar trebui să se întâmple când + + structura este dereferențiată cu operatorii `*` și `.`. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Aops%3A%3ADeref%3B%0Astruct%20TattleTell%3CT%3E%20%7B%0A%20%20%20%20value%3A%20T%2C%0A%7D%0Aimpl%3CT%3E%20Deref%20for%20TattleTell%3CT%3E%20%7B%0A%20%20%20%20type%20Target%20%3D%20T%3B%0A%20%20%20%20fn%20deref(%26self)%20-%3E%20%26T%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%20was%20used!%22%2C%20std%3A%3Aany%3A%3Atype_name%3A%3A%3CT%3E())%3B%0A%20%20%20%20%20%20%20%20%26self.value%0A%20%20%20%20%7D%0A%7D%0Afn%20main()%20%7B%0A%20%20%20%20let%20foo%20%3D%20TattleTell%20%7B%0A%20%20%20%20%20%20%20%20value%3A%20%22secret%20message%22%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20%2F%2F%20dereference%20occurs%20here%20immediately%20%0A%20%20%20%20%2F%2F%20after%20foo%20is%20auto-referenced%20for%20the%0A%20%20%20%20%2F%2F%20function%20%60len%60%0A%20%20%20%20println!(%22%7B%7D%22%2C%20foo.len())%3B%0A%7D%0A +- title: Cod nesigur inteligent + content_markdown: > + Pointerii inteligenti tind să folosească cod *nesigur* destul de des. După cum se menționa + mai devreme, + + sunt instrumente comune pentru interacțiunea cu cele mai scăzute niveluri de memorie în + Rugini. + + + Ce este un cod nesigur? Codul nesigur se comportă exact ca Rust normal cu + cu excepţia câtorva abilităţi care + + compilatorul Rust nu poate oferi garanții despre. + + + O abilitate principală a codului nesigur este *dereferențiarea unui pointer brut*. Acea + înseamnă a lua un *pointer brut* + + la o poziție în memorie și declarând „o structură de date există aici!” și + transformându-l într-o reprezentare a datelor pe care le puteți utiliza (adică `*const u8` în + `u8`). + + Rust nu are nicio modalitate de a urmări semnificația fiecărui octet care este scris + la memorie. Pentru că Rust nu poate + + garanta despre ceea ce există la un număr arbitrar folosit ca *pointer brut*, + pune dereferința într-un bloc `nesigur { ... }`. + + + Pointerii inteligenti *dereferențiază pointerii bruti* extensiv, dar sunt bine + dovediti în ceea ce fac. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20a%3A%20%5Bu8%3B%204%5D%20%3D%20%5B86%2C%2014%2C%2073%2C%2064%5D%3B%0A%20%20%20%20%2F%2F%20this%20is%20a%20raw%20pointer.%20Getting%20the%20memory%20address%0A%20%20%20%20%2F%2F%20of%20something%20as%20a%20number%20is%20totally%20safe%0A%20%20%20%20let%20pointer_a%20%3D%20%26a%20as%20*const%20u8%20as%20usize%3B%0A%20%20%20%20println!(%22Data%20memory%20location%3A%20%7B%7D%22%2C%20pointer_a)%3B%0A%20%20%20%20%2F%2F%20Turning%20our%20number%20into%20a%20raw%20pointer%20to%20a%20f32%20is%0A%20%20%20%20%2F%2F%20also%20safe%20to%20do.%0A%20%20%20%20let%20pointer_b%20%3D%20pointer_a%20as%20*const%20f32%3B%0A%20%20%20%20let%20b%20%3D%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20unsafe%20because%20we%20are%20telling%20the%20compiler%0A%20%20%20%20%20%20%20%20%2F%2F%20to%20assume%20our%20pointer%20is%20a%20valid%20f32%20and%0A%20%20%20%20%20%20%20%20%2F%2F%20dereference%20it's%20value%20into%20the%20variable%20b.%0A%20%20%20%20%20%20%20%20%2F%2F%20Rust%20has%20no%20way%20to%20verify%20this%20assumption%20is%20true.%0A%20%20%20%20%20%20%20%20*pointer_b%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22I%20swear%20this%20is%20a%20pie!%20%7B%7D%22%2C%20b)%3B%0A%7D%0A +- title: Prietenii familiari + content_markdown: > + Luați în considerare câțiva pointeri inteligenti pe care i-am văzut deja, cum ar fi `Vec` și `String`. + + `Vec` este un pointer inteligent care ține doar unele regiuni de memorie.Compilatorul Rust nu are idee ce există + în acești octeți. Indicatorul inteligent interpretează ce înseamnă să apuci + elemente din regiunea de memorie pe care o gestionează, + + ține evidența unde încep și se termină structurile de date din acești octeți și + apoi în cele din urmă dereferențiază un pointer brut + + în structuri de date într-o interfață ergonomică și curată pe care să o folosim + (de exemplu, `my_vec[3]`). + + + În mod similar, `String` ține evidența unei regiuni de memorie de octeți și + restricționează programatic conținutul scris pe acesta la întotdeauna + + să fie valid `utf-8` și ajută la dereferința acelei regiuni de memorie într-un tip + `&str`. + + + Ambele aceste structuri de date folosesc dereferențiarea nesigură a indicatorilor bruti pentru a face + munca lor. + + + Detaliu de memorie: + + * Rust are un echivalent al `malloc`-ului din C folosind + [alloc](https://doc.rust-lang.org/std/alloc/fn.alloc.html) și + [Layout](https://doc.rust-lang.org/std/alloc/struct.Layout.html) pentru + obținerea propriilor regiuni de memorie de gestionat. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Aalloc%3A%3A%7Balloc%2C%20Layout%7D%3B%0Ause%20std%3A%3Aops%3A%3ADeref%3B%0A%0Astruct%20Pie%20%7B%0A%20%20%20%20secret_recipe%3A%20usize%2C%0A%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20new()%20-%3E%20Self%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20let's%20ask%20for%204%20bytes%0A%20%20%20%20%20%20%20%20let%20layout%20%3D%20Layout%3A%3Afrom_size_align(4%2C%201).unwrap()%3B%0A%0A%20%20%20%20%20%20%20%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20allocate%20and%20save%20the%20memory%20location%20as%20a%20number%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20ptr%20%3D%20alloc(layout)%20as%20*mut%20u8%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20use%20pointer%20math%20and%20write%20a%20few%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20u8%20values%20to%20memory%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.write(86)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(1).write(14)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(2).write(73)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(3).write(64)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20Pie%20%7B%20secret_recipe%3A%20ptr%20as%20usize%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0Aimpl%20Deref%20for%20Pie%20%7B%0A%20%20%20%20type%20Target%20%3D%20f32%3B%0A%20%20%20%20fn%20deref(%26self)%20-%3E%20%26f32%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20interpret%20secret_recipe%20pointer%20as%20a%20f32%20raw%20pointer%0A%20%20%20%20%20%20%20%20let%20pointer%20%3D%20self.secret_recipe%20as%20*const%20f32%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20dereference%20it%20into%20a%20return%20value%20%26f32%0A%20%20%20%20%20%20%20%20unsafe%20%7B%20%26*pointer%20%7D%0A%20%20%20%20%7D%0A%7D%0Afn%20main()%20%7B%0A%20%20%20%20let%20p%20%3D%20Pie%3A%3Anew()%3B%0A%20%20%20%20%2F%2F%20%22make%20a%20pie%22%20by%20dereferencing%20our%20%0A%20%20%20%20%2F%2F%20Pie%20struct%20smart%20pointer%0A%20%20%20%20println!(%22%7B%3A%3F%7D%22%2C%20*p)%3B%0A%7D%0A +- title: Memorie alocată in heap + content_markdown: > + `Box` este un pointer inteligent care ne permite să mutăm datele din stivă în heap. + + + Dereferențiarea ne permite să folosim datele alocate în mod ergonomic ca și cum ar fi + fost tipul original. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22tastes%20better%20on%20the%20heap!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Box%3A%3Anew(Pie)%3B%0A%20%20%20%20heap_pie.eat()%3B%0A%7D%0A +- title: Main-ul esuabil revizitat + content_markdown: > + Codul Rust poate avea o multitudine de reprezentări ale erorilor, dar biblioteca + standard are + + o trăsătură universală `std::error::Error` pentru descrierea erorilor. + + + Folosind un pointer inteligent `Box` putem folosi tipul `Box` + ca tip comun pentru returnarea erorilor, deoarece ne permite să + + propagăm o eroare pe heap și să interacționăm cu ea la un nivel înalt + fără a fi nevoie să cunoască un anumit tip. + + + La începutul lui Tour of Rust am aflat că main-ul poate returna o eroare. Putem acum sa returnăm + + un tip capabil să descrie aproape orice fel de eroare care ar putea apărea în + programul nostru + + atâta timp cât structura de date a erorii implementează trăsătura comună „Error” comună a lui Rust. + + + ```rust + + fn main() -> Rezultat<(), Box> + + ``` + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Afmt%3A%3ADisplay%3B%0Ause%20std%3A%3Aerror%3A%3AError%3B%0A%0Astruct%20Pie%3B%0A%0A%23%5Bderive(Debug)%5D%0Astruct%20NotFreshError%3B%0A%0Aimpl%20Display%20for%20NotFreshError%20%7B%0A%20%20%20%20fn%20fmt(%26self%2C%20f%3A%20%26mut%20std%3A%3Afmt%3A%3AFormatter%3C%27_%3E)%20-%3E%20std%3A%3Afmt%3A%3AResult%20%7B%0A%20%20%20%20%20%20%20%20write!(f%2C%20%22This%20pie%20is%20not%20fresh!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20Error%20for%20NotFreshError%20%7B%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20-%3E%20Result%3C()%2C%20Box%3Cdyn%20Error%3E%3E%20%7B%0A%20%20%20%20%20%20%20%20Err(Box%3A%3Anew(NotFreshError))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20Box%3Cdyn%20Error%3E%3E%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Box%3A%3Anew(Pie)%3B%0A%20%20%20%20heap_pie.eat()%3F%3B%0A%20%20%20%20Ok(())%0A%7D%0A +- title: Numărarea referințelor + content_markdown: > + `Rc` este un pointer inteligent care mută datele din stivă pe heap. Aceasta + ne permite + + să clonăm alți pointeri inteligenți `Rc` care au toate capacitatea de a fi imutabili + împrumutați datele + + care a fost pus pe grămadă. + + + Numai atunci când ultimul pointer inteligent este aruncat, datele din heap devin + dealocate. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Arc%3A%3ARc%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22tastes%20better%20on%20the%20heap!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Rc%3A%3Anew(Pie)%3B%0A%20%20%20%20let%20heap_pie2%20%3D%20heap_pie.clone()%3B%0A%20%20%20%20let%20heap_pie3%20%3D%20heap_pie2.clone()%3B%0A%0A%20%20%20%20heap_pie3.eat()%3B%0A%20%20%20%20heap_pie2.eat()%3B%0A%20%20%20%20heap_pie.eat()%3B%0A%0A%20%20%20%20%2F%2F%20all%20reference%20count%20smart%20pointers%20are%20dropped%20now%0A%20%20%20%20%2F%2F%20the%20heap%20data%20Pie%20finally%20deallocates%0A%7D%0A +- title: Distribuirea adreselor + content_markdown: > + `RefCell` este o structură de date container deținută în mod obișnuit de pointerii inteligenți care + preiau date și ne lasă să + + împrumută referințe mutabile și imutabile la ceea ce se află în interior. Previne + împrumut de la a + + fii abuzat prin aplicarea regulilor de siguranță a memoriei Rust în timpul execuției atunci când solicităm + imprumutul + + datelor din: + + + **Doar o referință mutabilă SAU mai multe referințe imutabile, dar nu + ambii!** + + + Dacă încalci aceste reguli, „RefCell” va intra în panică. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Async%3A%3AMutex%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22only%20I%20eat%20the%20pie%20right%20now!%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20mutex_pie%20%3D%20Mutex%3A%3Anew(Pie)%3B%0A%20%20%20%20%2F%2F%20let's%20borrow%20a%20locked%20immutable%20reference%20of%20pie%0A%20%20%20%20%2F%2F%20we%20have%20to%20unwrap%20the%20result%20of%20a%20lock%0A%20%20%20%20%2F%2F%20because%20it%20might%20fail%0A%20%20%20%20let%20ref_pie%20%3D%20mutex_pie.lock().unwrap()%3B%0A%20%20%20%20ref_pie.eat()%3B%0A%20%20%20%20%2F%2F%20locked%20reference%20drops%20here%2C%20and%20mutex%20protected%20value%20can%20be%20used%20by%20someone%20else%0A%7D%0A +- title: Distribuirea in threads + content_markdown: > + `Mutex` este o structură de date container deținută în mod obișnuit de pointeri inteligenți care + preiau date și ne permite să împrumutăm referințe mutabile + + și imutabile la datele din interior. Acest lucru împiedică împrumutul de la a + fii abuzat , + + prin a avea sistemul de operare să restricționeze doar un thread CPU să aibă + acces la date, + + blocarea altor threaduri până când acel thread original este gata cu + imprumutul blocat. + + + Multithreading este dincolo de scopul Tour of Rust, dar `Mutex` este un + parte fundamentală a orchestrarii + + mai multe threaduri CPU care accesează aceleași date. + + + Există un indicator inteligent special `Arc` care este identic cu `Rc`, cu excepția că + folosește creșterea în siguranță a numărului de referințe. + + Este adesea folosit pentru a avea multe referințe la același „Mutex”. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Async%3A%3AMutex%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22only%20I%20eat%20the%20pie%20right%20now!%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20mutex_pie%20%3D%20Mutex%3A%3Anew(Pie)%3B%0A%20%20%20%20%2F%2F%20let's%20borrow%20a%20locked%20immutable%20reference%20of%20pie%0A%20%20%20%20%2F%2F%20we%20have%20to%20unwrap%20the%20result%20of%20a%20lock%0A%20%20%20%20%2F%2F%20because%20it%20might%20fail%0A%20%20%20%20let%20ref_pie%20%3D%20mutex_pie.lock().unwrap()%3B%0A%20%20%20%20ref_pie.eat()%3B%0A%20%20%20%20%2F%2F%20locked%20reference%20drops%20here%2C%20and%20mutex%20protected%20value%20can%20be%20used%20by%20someone%20else%0A%7D%0A +- title: Combinarea pointerilor inteligenți + content_markdown: > + Pointerii inteligenți pot părea limitați, dar pot face niște combinații foarte puternice. + + `Rc>` - Permite clonarea mai multor pointeri inteligente care pot împrumuta același vector de structuri de date imutabile pe heap. + + `Rc>` - Permite mai multor pointeri inteligenți abilitatea de a împrumuta în mod mutabil/imutabil aceeași structură Foo + + `Arc>` - Permite mai multor pointeri inteligente abilitatea de a bloca împrumuturi temporare mutabile/imuabile într-un mod exclusiv al unui fir CPU. + + Detaliu de memorie: + + * Veți observa o temă cu multe dintre aceste combinații. Utilizarea unui tip de date imutabil (posibil deținut de mai mulți pointeri inteligenți) + pentru a modifica datele interne. Acesta este denumit ca modelul de „mutabilitate interioară” în Rust. Este un tipar + care ne permite să îndoim regulile de utilizare a memoriei în timpul execuției, cu același nivel de siguranță ca și + verificările lui Rust la timp de compilare. + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Acell%3A%3ARefCell%3B%0Ause%20std%3A%3Arc%3A%3ARc%3B%0A%0Astruct%20Pie%20%7B%0A%20%20%20%20slices%3A%20u8%2C%0A%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat_slice(%26mut%20self%2C%20name%3A%20%26str)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%20took%20a%20slice!%22%2C%20name)%3B%0A%20%20%20%20%20%20%20%20self.slices%20-%3D%201%3B%0A%20%20%20%20%7D%0A%7D%0A%0Astruct%20SeaCreature%20%7B%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20pie%3A%20Rc%3CRefCell%3CPie%3E%3E%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20use%20smart%20pointer%20to%20pie%20for%20a%20mutable%20borrow%0A%20%20%20%20%20%20%20%20let%20mut%20p%20%3D%20self.pie.borrow_mut()%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20take%20a%20bite!%0A%20%20%20%20%20%20%20%20p.eat_slice(%26self.name)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20pie%20%3D%20Rc%3A%3Anew(RefCell%3A%3Anew(Pie%20%7B%20slices%3A%208%20%7D))%3B%0A%20%20%20%20%2F%2F%20ferris%20and%20sarah%20are%20given%20clones%20of%20smart%20pointer%20to%20pie%0A%20%20%20%20let%20ferris%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22ferris%22)%2C%0A%20%20%20%20%20%20%20%20pie%3A%20pie.clone()%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20sarah%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22sarah%22)%2C%0A%20%20%20%20%20%20%20%20pie%3A%20pie.clone()%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20ferris.eat()%3B%0A%20%20%20%20sarah.eat()%3B%0A%0A%20%20%20%20let%20p%20%3D%20pie.borrow()%3B%0A%20%20%20%20println!(%22%7B%7D%20slices%20left%22%2C%20p.slices)%3B%0A%7D%0A +- title: Concluzii + content_markdown: > + Pointerii inteligenți sunt expresiile de programare Rust și ne permite să nu recreem + modele foarte comune de utilizare a memoriei. Cu ele sunteți gata să abordați + cel mai dificile + + provocări! Acum că avem bazele Rust, hai să vorbim puțin despre + cum facem + + proiecte mai mari. În capitolul 9 ne eliberăm de o singură pagină de + + linii de cod. + From 256563a57107de9edb8d94abb9bc1e2d43d5264f Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Fri, 19 Jan 2024 09:35:47 +0000 Subject: [PATCH 02/10] Changes made --- .idea/.gitignore | 8 -- .idea/inspectionProfiles/Project_Default.xml | 6 -- .idea/modules.xml | 8 -- .idea/tour_of_rust.iml | 8 -- .idea/vcs.xml | 6 -- lessons/en/chapter_8.yaml | 16 ++-- yarn.lock | 88 ++++++-------------- 7 files changed, 34 insertions(+), 106 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/tour_of_rust.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549ea..000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index dd01c727f..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/tour_of_rust.iml b/.idea/tour_of_rust.iml deleted file mode 100644 index 610219404..000000000 --- a/.idea/tour_of_rust.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/lessons/en/chapter_8.yaml b/lessons/en/chapter_8.yaml index 238d99e9f..79290ad46 100644 --- a/lessons/en/chapter_8.yaml +++ b/lessons/en/chapter_8.yaml @@ -353,13 +353,15 @@ - title: Chapter 8 - Conclusion content_markdown: > - Pointerii inteligenți sunt expresiile de programare Rust și ne permite să nu recreem - modele foarte comune de utilizare a memoriei. Cu ele sunteți gata să abordați - cel mai dificile + Smart pointers are the idioms of Rust programming and let us not have to + re-create the - provocări! Acum că avem bazele Rust, hai să vorbim puțin despre - cum facem + very common patterns of memory usage. With them you are ready to tackle the + toughest of - proiecte mai mari. În capitolul 9 ne eliberăm de o singură pagină de + challenges! Now that we have the foundations of Rust, let's talk a bit about + how we make - linii de cod. + larger projects. In chapter 9 we break free of single page + + lines of code. diff --git a/yarn.lock b/yarn.lock index 7673abc2d..97f4e8d92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,7 +53,7 @@ acorn-jsx@^5.3.1: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -93,14 +93,7 @@ ansi-regex@^5.0.0: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -252,16 +245,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -324,13 +317,6 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - doctrine@1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" @@ -339,6 +325,13 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" @@ -458,12 +451,7 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -473,7 +461,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.16.0 || ^6.8.0 || ^7.2.0", eslint@^7.26.0: +eslint@^7.26.0: version "7.26.0" resolved "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz" integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== @@ -549,12 +537,7 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -971,16 +954,16 @@ minimist@^1.2.0: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -1268,7 +1251,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.7.1: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -1285,11 +1268,6 @@ semver@~7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -1361,16 +1339,7 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^3.1.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -1428,14 +1397,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== From d5b97994238078d2f2d82680a86dd6a24976485a Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Sun, 21 Jan 2024 20:15:42 +0000 Subject: [PATCH 03/10] Translated Chapter 7 in Italian --- lessons/it/chapter_7.yaml | 312 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 lessons/it/chapter_7.yaml diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml new file mode 100644 index 000000000..d0b1857d2 --- /dev/null +++ b/lessons/it/chapter_7.yaml @@ -0,0 +1,312 @@ +- title: Capitolo 7 - Programmazione orientata agli oggetti + content_markdown: > + Esprimere idee con funzioni è un modo comprovato di rappresentare il comportamento e + dati (C + + lo fa da decenni!). Storicamente, l'informatica ha trovato + altro + + utili aggregazioni espressive e astrazioni per i dati. Potresti essere + familiarità con la programmazione orientata agli oggetti (OOP) come tale + + in questo modo. In questo capitolo esploreremo il linguaggio di programmazione Rust oltre + funzioni. +- title: Cos'è l'OOP? + content_markdown: > + La programmazione orientata agli oggetti si riferisce approssimativamente ai linguaggi di programmazione che + hanno una serie di caratteristiche iconiche: + + * Incapsulamento - Associazione di dati e funzioni nell'unità concettuale di + un singolo tipo chiamato *oggetto*. + + * Astrazione: nascondere dati e membri di funzioni per offuscare l'implementazione + dettagli di un oggetto. + + * Polimorfismo - La capacità di interagire con oggetti di diverso tipo attraverso + un'unica interfaccia. + + * Ereditarietà: la capacità di ereditare dati e comportamenti da altri oggetti. +- title: Rust non è OOP + content_markdown: > + A Rust manca l'ereditarietà dei dati e del comportamento in modo significativo. + + + * Le strutture non possono ereditare i campi da una struttura genitore. + + * Le strutture non possono ereditare funzioni da una struttura genitore. + + + Detto questo, Rust implementa molte funzionalità del linguaggio di programmazione, in modo che tu + potrebbe non dispiacere questa mancanza. +- title: Incapsulamento con metodi + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20creature.get_sound())%3B%0A%7D%0A + content_markdown: > + Rust supporta il concetto di *oggetto* a cui è associata una struttura + alcune funzioni (conosciute anche come *metodi*). + + + Il primo parametro di qualsiasi metodo deve essere un riferimento all'istanza + associato alla chiamata del metodo (ad esempio `instanceOfObj.foo()`). La ruggine utilizza: + + * `&self` - Riferimento immutabile all'istanza. + + * `&mut self` - Riferimento mutabile all'istanza. + + + I metodi sono definiti all'interno di un blocco di implementazione con la parola chiave "impl": + + ```rust + + impl MyStruct { + ... + fn foo(&self) { + ... + } + } + + ``` +- title: Astrazione con esposizione selettiva + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20creature.get_sound())%3B%0A%7D%0A + content_markdown: > + Rust può nascondere il funzionamento interno degli oggetti. + + + Per impostazione predefinita campi e metodi sono accessibili solo al modulo a cui appartengono + A. + + + La parola chiave "pub" espone campi e metodi della struttura all'esterno del modulo. +- title: Polimorfismo con tratti + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A + content_markdown: > + Rust supporta il polimorfismo con i tratti. I tratti ci permettono di associare un insieme + di metodi con un tipo struct. + + + Per prima cosa definiamo le firme dei metodi di un tratto all'interno di: + + + ``` + + tratto Il mio tratto { + fn foo(&self); + ... + } + + ``` + + + Quando una struttura implementa un tratto, stabilisce un contratto che ce lo consente + per interagire indirettamente con la struttura + + attraverso il tipo di tratto (ad esempio `&dyn MyTrait`) senza dover conoscere il reale + tipo. + + + I metodi dei tratti implementati di una struttura sono definiti all'interno di un'implementazione + bloccare: + + + "ruggine". + + impl MyTrait per MyStruct { + fn foo(&self) { + ... + } + ... + } + + ``` +- title: Metodi implementati sui tratti + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%20%20%20%20%0A%20%20%20%20fn%20make_alot_of_noise(%26self)%7B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_alot_of_noise()%3B%0A%7D%0A + content_markdown: > + I tratti possono avere metodi implementati. + + + Le funzioni non hanno accesso diretto ai campi interni di una struttura, ma esso + Potere + + essere utile per condividere il comportamento tra molti implementatori di tratti. +- title: Eredità dei tratti + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Atrait%20LoudNoiseMaker%3A%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_alot_of_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20LoudNoiseMaker%20for%20SeaCreature%20%7B%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_alot_of_noise()%3B%0A%7D%0A + content_markdown: > + I tratti possono ereditare metodi da altri tratti. +- title: Invio dinamico e statico + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20static_make_noise(creature%3A%20%26SeaCreature)%20%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20dynamic_make_noise(noise_maker%3A%20%26dyn%20NoiseMaker)%20%7B%0A%20%20%20%20%2F%2F%20we%20don't%20know%20the%20real%20type%0A%20%20%20%20noise_maker.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20static_make_noise(%26creature)%3B%0A%20%20%20%20dynamic_make_noise(%26creature)%3B%0A%7D%0A + content_markdown: > + I metodi vengono eseguiti in due modi: + + * invio statico: quando il tipo di istanza è noto, abbiamo direct + conoscenza di quale funzione chiamare. + + * invio dinamico: quando un tipo di istanza non è noto, dobbiamo scoprirlo + un modo per chiamare la funzione corretta. + + + I tipi di tratto "&dyn MyTrait" ci danno la possibilità di lavorare con istanze di + oggetti indirettamente utilizzando l'invio dinamico. + + + Quando viene utilizzato l'invio dinamico, Rust ti incoraggerà a mettere `dyn` prima + il tuo tipo di tratto in modo che le persone ne siano consapevoli. + + + Dettagli della memoria: + + * L'invio dinamico è leggermente più lento a causa del puntatore che cerca di trovare + la vera chiamata di funzione. +- title: Oggetti tratti + content_markdown: > + Quando passiamo un'istanza di un oggetto a un parametro di tipo `&dyn MyTrait` + passiamo quello che viene chiamato *oggetto tratto*. + + + Un oggetto tratto è ciò che ci consente di chiamare indirettamente i metodi corretti di + un caso. Un oggetto tratto è una struttura che contiene il puntatore di + + la nostra istanza con un elenco di puntatori a funzioni ai metodi della nostra istanza. + + + Dettagli della memoria: + + * Questo elenco di funzioni è noto in C++ come *vtable*. +- title: Funzioni generiche + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20generic_make_noise%3CT%3E(creature%3A%20%26T)%0Awhere%0A%20%20%20%20T%3A%20NoiseMaker%2C%0A%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%20at%20compile-time%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20generic_make_noise(%26creature)%3B%0A%7D%0A + content_markdown: > + I generici in Rust lavorano di pari passo con i tratti. Quando descriviamo a + tipo parametrizzato "T" possiamo limitare quali tipi + + può essere utilizzato come argomento elencando i tratti richiesti dall'argomento + strumento. + + + In questo esempio il tipo "T" deve implementare il tratto "Foo": + + ```rust + + fn mia_funzione(foo: T) + + Dove + T:Foo + { + ... + } + + ``` + + + Utilizzando i generici creiamo funzioni tipizzate statiche in fase di compilazione che lo faranno + hanno tipologie e dimensioni conosciute, permettendocelo + + eseguire l'invio statico e archiviarlo come valore dimensionato. +- title: Abbreviazione di funzioni generiche + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20generic_make_noise(creature%3A%20%26impl%20NoiseMaker)%0A%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%20at%20compile-time%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20generic_make_noise(%26creature)%3B%0A%7D%0A + content_markdown: > + Rust has a shorthand for expressing generics constrained by a trait: + + ```rust + fn my_function(foo: impl Foo) { + ... + } + ``` + + This is equivalent to writing: + + ```rust + fn my_function(foo: T) + where + T:Foo + { + ... + } + ``` +- title: Box + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Astruct%20Ocean%20%7B%0A%20%20%20%20animals%3A%20Vec%3CBox%3Cdyn%20NoiseMaker%3E%3E%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%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20sarah%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Sarah%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22swish%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20ocean%20%3D%20Ocean%20%7B%0A%20%20%20%20%20%20%20%20animals%3A%20vec!%5BBox%3A%3Anew(ferris)%2C%20Box%3A%3Anew(sarah)%5D%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20for%20a%20in%20ocean.animals.iter()%20%7B%0A%20%20%20%20%20%20%20%20a.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A + content_markdown: > + `Box` è una struttura dati che ci consente di spostare i nostri dati dallo stack a + il mucchio. + + + `Box` è una struttura conosciuta come *puntatore intelligente* che contiene il puntatore a our + dati nell'heap. + + + Poiché `Box` è una struttura con una dimensione nota (perché contiene solo un file + puntatore), lo è + + spesso usato come modo per memorizzare un riferimento a qualcosa in una struttura che deve + conoscere la dimensione + + dei suoi campi. + + + `Box` è così comune che può essere utilizzato ovunque: + + + ```rust + + Casella::new(Foo { ... }) + + ``` +- title: Strutture generiche rivisitate + content_markdown: > + Le strutture generiche possono anche avere i propri tipi parametrizzati vincolati da + tratti. + + + ```rust + + struct MiaStruct + + Dove + T: Il mio tratto + { + piede + ... + } + + ``` + + + Le strutture generiche hanno il loro tipo parametrizzato nella loro implementazione + blocchi: + + + ```rust + + impl MiaStruct { + ... + } + + ``` +- title: Capitolo 7 - Conclusione + content_markdown: > + Ora abbiamo più funzionalità linguistiche a portata di mano per rappresentare chiaramente le nostre idee! + + Le astrazioni di Rust potrebbero essere semplici ma sono abbastanza potenti da essere realizzate + + lavorare con il codice è una gioia. In questo capitolo abbiamo intravisto il concetto di smart + puntatori + + con "Scatola". Nel prossimo capitolo impareremo come possono farlo i puntatori intelligenti + aiutaci con altro + + situazioni di memoria specializzate. + + + Risorse: + + * [Video - Object-oriented Programming in 7 + minutes](https://www.youtube.com/watch?v=pTB0EiLXUC8) + + * [Articolo - "The faster you unlearn OOP, the better for you and your + software"](https://dpc.pw/the-faster-you-unlearn-oop-the-better-for-you-and-your-software) \ No newline at end of file From a5bca7999539e41afaa66f9a610e90ed34c6385e Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Sun, 21 Jan 2024 20:22:09 +0000 Subject: [PATCH 04/10] Translation for Chapter 7 in Italian --- lessons/ro/chapter_8.yaml | 324 -------------------------------------- 1 file changed, 324 deletions(-) delete mode 100644 lessons/ro/chapter_8.yaml diff --git a/lessons/ro/chapter_8.yaml b/lessons/ro/chapter_8.yaml deleted file mode 100644 index 27d1d336c..000000000 --- a/lessons/ro/chapter_8.yaml +++ /dev/null @@ -1,324 +0,0 @@ -- title: Capitolul 8 - Pointerii inteligenti - content_markdown: > - - În acest capitol vom demistifica pointerii inteligenți. Să explorăm aceste structuri de date care ne permit - să interacționăm cu cel mai de jos nivel al memoriei. - - Ferris spune: "Nu te simți copleșit de acest capitol dacă nu simți că poți scrie propriul tău cod de gestionare - a memoriei la nivel scăzut într-o singură lectură scurtă. Acest capitol are în principal rolul de a te introduce - în unele instrumente utile și de a-ți oferi o privire asupra modului în care funcționează!" - -- title: Referințe revizuite - content_markdown: > - O referință este în principiu doar un număr care este poziția de început a unor octeți din memorie. - Singurul său scop este de a reprezenta conceptul unde există date de un anumit tip. - Ceea ce face o referință diferită de doar un număr este că Rust va valida durata de viață a referințelor nu durează - mai mult decât la care se referă (altfel am primi o eroare când am folosit-o!). - -- title: Pointeri bruți - content_markdown: > - Referințele pot fi convertite într-un tip mai primitiv numit indicator brut. La fel ca un număr, acesta poate fi - copiat și mutat cu puține restricții. Rust nu oferă nicio asigurare cu privire la validitatea locației de memorie către care indică. - - Există două tipuri de indicatori bruti: - - * `*const T` - Un indicator brut către date de tip T care nu ar trebui să se schimbe niciodată. - * `*mut T` - Un indicator brut către date de tip T care se pot modifica. - Indicatoarele brute pot fi convertite în și din numere (de exemplu, `usize`). - - Indicatorii bruti pot accesa datele cu cod nesigur (mai multe despre asta mai târziu). - - Detalii de memorie: - - * O referință în Rust este foarte asemănătoare cu un pointer în C în ceea ce privește utilizarea, dar cu mult mai multe - restricții de timp de compilare privind modul în care poate fi stocată și mutată în alte funcții. - * Un indicator brut din Rust este similar cu un indicator din C, deoarece reprezintă un număr care poate fi copiat sau - transmis și chiar transformat în tipuri numerice unde poate fi modificat ca număr pentru a face matematica indicatorului. - 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%2042%3B%0A%20%20%20%20let%20memory_location%20%3D%20%26a%20as%20*const%20i32%20as%20usize%3B%0A%20%20%20%20println!(%22Data%20is%20here%20%7B%7D%22%2C%20memory_location)%3B%0A%7D%0A - -- title: Dereferențierea - content_markdown: > - Procesul de accesare/manipulare a datelor la care se face referire printr-o referință (adică &i32) se numește dereferencing. - - Referințele sunt folosite pentru a accesa/manipula datele în două moduri: - - Accesul la datele menționate în timpul atribuirii variabilelor. - Acces la câmpuri sau metode ale datelor menționate. - Rust are niște operatori puternici care ne permit să facem acest lucru. - -- title: Operatorul * - content_markdown: > - Operatorul `*` este o modalitate explicită de a dereferi o referință. - - - ```rust - - let a: i32 = 42; - - let ref_ref_ref_a: &&&i32 = &&&a; - - let ref_a: &i32 = **ref_ref_ref_a; - - let b: i32 = *ref_a; - - ``` - - - Detaliu de memorie: - - - Deoarece i32 este un tip primitiv care implementează trăsătura „Copy”, - - octeții variabilei `a` de pe stivă sunt copiați în octeții variabilei - `b`. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20a%3A%20i32%20%3D%2042%3B%0A%20%20%20%20let%20ref_ref_ref_a%3A%20%26%26%26i32%20%3D%20%26%26%26a%3B%0A%20%20%20%20let%20ref_a%3A%20%26i32%20%3D%20**ref_ref_ref_a%3B%0A%20%20%20%20let%20b%3A%20i32%20%3D%20*ref_a%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20b)%0A%7D -- title: Operatorul . - content_markdown: > - Operatorul `.` este utilizat în accesarea câmpurilor și metodelor unei referințe. Acesta - funcționează puțin mai subtil. - - - - ```rust - - let f = Foo { value: 42 }; - - let ref_ref_ref_f = &&&f; - - println!("{}", ref_ref_ref_f.value); - - ``` - Woa, de ce nu a fost nevoie să adăugăm `***` înainte de `ref_ref_ref_f`? Aceasta este - deoarece operatorul `.` dereferențiază automat.Ultima linie este transformată automat în următoarea de către compilator. - - - ```rust - - println!("{}", (***ref_ref_ref_f).value); - - - ``` - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Foo%20%7B%0A%20%20%20%20value%3A%20i32%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20f%20%3D%20Foo%20%7B%20value%3A%2042%20%7D%3B%0A%20%20%20%20let%20ref_ref_ref_f%20%3D%20%26%26%26f%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20ref_ref_ref_f.value)%3B%0A%7D -- title: Pointerii inteligenti - content_markdown: > - În plus față de capacitatea de a crea referințe la datele tastate existente folosind - operatorul `&`, Rust ne oferă capacitatea - - pentru a crea structuri * reference-like * referințe numite ** pointeri inteligenti **. - - - Ne putem gândi la referințe la un nivel înalt ca la un tip care ne oferă acces la - alt tip. Indicatoarele inteligente sunt diferite în ceea ce privește - - comportamentul de la referințe normale prin faptul că acestea funcționează pe baza logicii interne - pe care le scrie un programator. Tu — programatorul — esti partea *inteligentă*. - - - În mod obișnuit, pointerii inteligenti implementează trăsăturile „Deref”, „DerefMut” și „Drop” la - specificați logica a ceea ce ar trebui să se întâmple când - - structura este dereferențiată cu operatorii `*` și `.`. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Aops%3A%3ADeref%3B%0Astruct%20TattleTell%3CT%3E%20%7B%0A%20%20%20%20value%3A%20T%2C%0A%7D%0Aimpl%3CT%3E%20Deref%20for%20TattleTell%3CT%3E%20%7B%0A%20%20%20%20type%20Target%20%3D%20T%3B%0A%20%20%20%20fn%20deref(%26self)%20-%3E%20%26T%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%20was%20used!%22%2C%20std%3A%3Aany%3A%3Atype_name%3A%3A%3CT%3E())%3B%0A%20%20%20%20%20%20%20%20%26self.value%0A%20%20%20%20%7D%0A%7D%0Afn%20main()%20%7B%0A%20%20%20%20let%20foo%20%3D%20TattleTell%20%7B%0A%20%20%20%20%20%20%20%20value%3A%20%22secret%20message%22%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20%2F%2F%20dereference%20occurs%20here%20immediately%20%0A%20%20%20%20%2F%2F%20after%20foo%20is%20auto-referenced%20for%20the%0A%20%20%20%20%2F%2F%20function%20%60len%60%0A%20%20%20%20println!(%22%7B%7D%22%2C%20foo.len())%3B%0A%7D%0A -- title: Cod nesigur inteligent - content_markdown: > - Pointerii inteligenti tind să folosească cod *nesigur* destul de des. După cum se menționa - mai devreme, - - sunt instrumente comune pentru interacțiunea cu cele mai scăzute niveluri de memorie în - Rugini. - - - Ce este un cod nesigur? Codul nesigur se comportă exact ca Rust normal cu - cu excepţia câtorva abilităţi care - - compilatorul Rust nu poate oferi garanții despre. - - - O abilitate principală a codului nesigur este *dereferențiarea unui pointer brut*. Acea - înseamnă a lua un *pointer brut* - - la o poziție în memorie și declarând „o structură de date există aici!” și - transformându-l într-o reprezentare a datelor pe care le puteți utiliza (adică `*const u8` în - `u8`). - - Rust nu are nicio modalitate de a urmări semnificația fiecărui octet care este scris - la memorie. Pentru că Rust nu poate - - garanta despre ceea ce există la un număr arbitrar folosit ca *pointer brut*, - pune dereferința într-un bloc `nesigur { ... }`. - - - Pointerii inteligenti *dereferențiază pointerii bruti* extensiv, dar sunt bine - dovediti în ceea ce fac. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20a%3A%20%5Bu8%3B%204%5D%20%3D%20%5B86%2C%2014%2C%2073%2C%2064%5D%3B%0A%20%20%20%20%2F%2F%20this%20is%20a%20raw%20pointer.%20Getting%20the%20memory%20address%0A%20%20%20%20%2F%2F%20of%20something%20as%20a%20number%20is%20totally%20safe%0A%20%20%20%20let%20pointer_a%20%3D%20%26a%20as%20*const%20u8%20as%20usize%3B%0A%20%20%20%20println!(%22Data%20memory%20location%3A%20%7B%7D%22%2C%20pointer_a)%3B%0A%20%20%20%20%2F%2F%20Turning%20our%20number%20into%20a%20raw%20pointer%20to%20a%20f32%20is%0A%20%20%20%20%2F%2F%20also%20safe%20to%20do.%0A%20%20%20%20let%20pointer_b%20%3D%20pointer_a%20as%20*const%20f32%3B%0A%20%20%20%20let%20b%20%3D%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20unsafe%20because%20we%20are%20telling%20the%20compiler%0A%20%20%20%20%20%20%20%20%2F%2F%20to%20assume%20our%20pointer%20is%20a%20valid%20f32%20and%0A%20%20%20%20%20%20%20%20%2F%2F%20dereference%20it's%20value%20into%20the%20variable%20b.%0A%20%20%20%20%20%20%20%20%2F%2F%20Rust%20has%20no%20way%20to%20verify%20this%20assumption%20is%20true.%0A%20%20%20%20%20%20%20%20*pointer_b%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22I%20swear%20this%20is%20a%20pie!%20%7B%7D%22%2C%20b)%3B%0A%7D%0A -- title: Prietenii familiari - content_markdown: > - Luați în considerare câțiva pointeri inteligenti pe care i-am văzut deja, cum ar fi `Vec` și `String`. - - `Vec` este un pointer inteligent care ține doar unele regiuni de memorie.Compilatorul Rust nu are idee ce există - în acești octeți. Indicatorul inteligent interpretează ce înseamnă să apuci - elemente din regiunea de memorie pe care o gestionează, - - ține evidența unde încep și se termină structurile de date din acești octeți și - apoi în cele din urmă dereferențiază un pointer brut - - în structuri de date într-o interfață ergonomică și curată pe care să o folosim - (de exemplu, `my_vec[3]`). - - - În mod similar, `String` ține evidența unei regiuni de memorie de octeți și - restricționează programatic conținutul scris pe acesta la întotdeauna - - să fie valid `utf-8` și ajută la dereferința acelei regiuni de memorie într-un tip - `&str`. - - - Ambele aceste structuri de date folosesc dereferențiarea nesigură a indicatorilor bruti pentru a face - munca lor. - - - Detaliu de memorie: - - * Rust are un echivalent al `malloc`-ului din C folosind - [alloc](https://doc.rust-lang.org/std/alloc/fn.alloc.html) și - [Layout](https://doc.rust-lang.org/std/alloc/struct.Layout.html) pentru - obținerea propriilor regiuni de memorie de gestionat. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Aalloc%3A%3A%7Balloc%2C%20Layout%7D%3B%0Ause%20std%3A%3Aops%3A%3ADeref%3B%0A%0Astruct%20Pie%20%7B%0A%20%20%20%20secret_recipe%3A%20usize%2C%0A%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20new()%20-%3E%20Self%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20let's%20ask%20for%204%20bytes%0A%20%20%20%20%20%20%20%20let%20layout%20%3D%20Layout%3A%3Afrom_size_align(4%2C%201).unwrap()%3B%0A%0A%20%20%20%20%20%20%20%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20allocate%20and%20save%20the%20memory%20location%20as%20a%20number%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20ptr%20%3D%20alloc(layout)%20as%20*mut%20u8%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20use%20pointer%20math%20and%20write%20a%20few%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20u8%20values%20to%20memory%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.write(86)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(1).write(14)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(2).write(73)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20ptr.add(3).write(64)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20Pie%20%7B%20secret_recipe%3A%20ptr%20as%20usize%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0Aimpl%20Deref%20for%20Pie%20%7B%0A%20%20%20%20type%20Target%20%3D%20f32%3B%0A%20%20%20%20fn%20deref(%26self)%20-%3E%20%26f32%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20interpret%20secret_recipe%20pointer%20as%20a%20f32%20raw%20pointer%0A%20%20%20%20%20%20%20%20let%20pointer%20%3D%20self.secret_recipe%20as%20*const%20f32%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20dereference%20it%20into%20a%20return%20value%20%26f32%0A%20%20%20%20%20%20%20%20unsafe%20%7B%20%26*pointer%20%7D%0A%20%20%20%20%7D%0A%7D%0Afn%20main()%20%7B%0A%20%20%20%20let%20p%20%3D%20Pie%3A%3Anew()%3B%0A%20%20%20%20%2F%2F%20%22make%20a%20pie%22%20by%20dereferencing%20our%20%0A%20%20%20%20%2F%2F%20Pie%20struct%20smart%20pointer%0A%20%20%20%20println!(%22%7B%3A%3F%7D%22%2C%20*p)%3B%0A%7D%0A -- title: Memorie alocată in heap - content_markdown: > - `Box` este un pointer inteligent care ne permite să mutăm datele din stivă în heap. - - - Dereferențiarea ne permite să folosim datele alocate în mod ergonomic ca și cum ar fi - fost tipul original. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=struct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22tastes%20better%20on%20the%20heap!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Box%3A%3Anew(Pie)%3B%0A%20%20%20%20heap_pie.eat()%3B%0A%7D%0A -- title: Main-ul esuabil revizitat - content_markdown: > - Codul Rust poate avea o multitudine de reprezentări ale erorilor, dar biblioteca - standard are - - o trăsătură universală `std::error::Error` pentru descrierea erorilor. - - - Folosind un pointer inteligent `Box` putem folosi tipul `Box` - ca tip comun pentru returnarea erorilor, deoarece ne permite să - - propagăm o eroare pe heap și să interacționăm cu ea la un nivel înalt - fără a fi nevoie să cunoască un anumit tip. - - - La începutul lui Tour of Rust am aflat că main-ul poate returna o eroare. Putem acum sa returnăm - - un tip capabil să descrie aproape orice fel de eroare care ar putea apărea în - programul nostru - - atâta timp cât structura de date a erorii implementează trăsătura comună „Error” comună a lui Rust. - - - ```rust - - fn main() -> Rezultat<(), Box> - - ``` - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Afmt%3A%3ADisplay%3B%0Ause%20std%3A%3Aerror%3A%3AError%3B%0A%0Astruct%20Pie%3B%0A%0A%23%5Bderive(Debug)%5D%0Astruct%20NotFreshError%3B%0A%0Aimpl%20Display%20for%20NotFreshError%20%7B%0A%20%20%20%20fn%20fmt(%26self%2C%20f%3A%20%26mut%20std%3A%3Afmt%3A%3AFormatter%3C%27_%3E)%20-%3E%20std%3A%3Afmt%3A%3AResult%20%7B%0A%20%20%20%20%20%20%20%20write!(f%2C%20%22This%20pie%20is%20not%20fresh!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20Error%20for%20NotFreshError%20%7B%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20-%3E%20Result%3C()%2C%20Box%3Cdyn%20Error%3E%3E%20%7B%0A%20%20%20%20%20%20%20%20Err(Box%3A%3Anew(NotFreshError))%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20-%3E%20Result%3C()%2C%20Box%3Cdyn%20Error%3E%3E%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Box%3A%3Anew(Pie)%3B%0A%20%20%20%20heap_pie.eat()%3F%3B%0A%20%20%20%20Ok(())%0A%7D%0A -- title: Numărarea referințelor - content_markdown: > - `Rc` este un pointer inteligent care mută datele din stivă pe heap. Aceasta - ne permite - - să clonăm alți pointeri inteligenți `Rc` care au toate capacitatea de a fi imutabili - împrumutați datele - - care a fost pus pe grămadă. - - - Numai atunci când ultimul pointer inteligent este aruncat, datele din heap devin - dealocate. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Arc%3A%3ARc%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22tastes%20better%20on%20the%20heap!%22)%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20heap_pie%20%3D%20Rc%3A%3Anew(Pie)%3B%0A%20%20%20%20let%20heap_pie2%20%3D%20heap_pie.clone()%3B%0A%20%20%20%20let%20heap_pie3%20%3D%20heap_pie2.clone()%3B%0A%0A%20%20%20%20heap_pie3.eat()%3B%0A%20%20%20%20heap_pie2.eat()%3B%0A%20%20%20%20heap_pie.eat()%3B%0A%0A%20%20%20%20%2F%2F%20all%20reference%20count%20smart%20pointers%20are%20dropped%20now%0A%20%20%20%20%2F%2F%20the%20heap%20data%20Pie%20finally%20deallocates%0A%7D%0A -- title: Distribuirea adreselor - content_markdown: > - `RefCell` este o structură de date container deținută în mod obișnuit de pointerii inteligenți care - preiau date și ne lasă să - - împrumută referințe mutabile și imutabile la ceea ce se află în interior. Previne - împrumut de la a - - fii abuzat prin aplicarea regulilor de siguranță a memoriei Rust în timpul execuției atunci când solicităm - imprumutul - - datelor din: - - - **Doar o referință mutabilă SAU mai multe referințe imutabile, dar nu - ambii!** - - - Dacă încalci aceste reguli, „RefCell” va intra în panică. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Async%3A%3AMutex%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22only%20I%20eat%20the%20pie%20right%20now!%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20mutex_pie%20%3D%20Mutex%3A%3Anew(Pie)%3B%0A%20%20%20%20%2F%2F%20let's%20borrow%20a%20locked%20immutable%20reference%20of%20pie%0A%20%20%20%20%2F%2F%20we%20have%20to%20unwrap%20the%20result%20of%20a%20lock%0A%20%20%20%20%2F%2F%20because%20it%20might%20fail%0A%20%20%20%20let%20ref_pie%20%3D%20mutex_pie.lock().unwrap()%3B%0A%20%20%20%20ref_pie.eat()%3B%0A%20%20%20%20%2F%2F%20locked%20reference%20drops%20here%2C%20and%20mutex%20protected%20value%20can%20be%20used%20by%20someone%20else%0A%7D%0A -- title: Distribuirea in threads - content_markdown: > - `Mutex` este o structură de date container deținută în mod obișnuit de pointeri inteligenți care - preiau date și ne permite să împrumutăm referințe mutabile - - și imutabile la datele din interior. Acest lucru împiedică împrumutul de la a - fii abuzat , - - prin a avea sistemul de operare să restricționeze doar un thread CPU să aibă - acces la date, - - blocarea altor threaduri până când acel thread original este gata cu - imprumutul blocat. - - - Multithreading este dincolo de scopul Tour of Rust, dar `Mutex` este un - parte fundamentală a orchestrarii - - mai multe threaduri CPU care accesează aceleași date. - - - Există un indicator inteligent special `Arc` care este identic cu `Rc`, cu excepția că - folosește creșterea în siguranță a numărului de referințe. - - Este adesea folosit pentru a avea multe referințe la același „Mutex”. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Async%3A%3AMutex%3B%0A%0Astruct%20Pie%3B%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22only%20I%20eat%20the%20pie%20right%20now!%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20mutex_pie%20%3D%20Mutex%3A%3Anew(Pie)%3B%0A%20%20%20%20%2F%2F%20let's%20borrow%20a%20locked%20immutable%20reference%20of%20pie%0A%20%20%20%20%2F%2F%20we%20have%20to%20unwrap%20the%20result%20of%20a%20lock%0A%20%20%20%20%2F%2F%20because%20it%20might%20fail%0A%20%20%20%20let%20ref_pie%20%3D%20mutex_pie.lock().unwrap()%3B%0A%20%20%20%20ref_pie.eat()%3B%0A%20%20%20%20%2F%2F%20locked%20reference%20drops%20here%2C%20and%20mutex%20protected%20value%20can%20be%20used%20by%20someone%20else%0A%7D%0A -- title: Combinarea pointerilor inteligenți - content_markdown: > - Pointerii inteligenți pot părea limitați, dar pot face niște combinații foarte puternice. - - `Rc>` - Permite clonarea mai multor pointeri inteligente care pot împrumuta același vector de structuri de date imutabile pe heap. - - `Rc>` - Permite mai multor pointeri inteligenți abilitatea de a împrumuta în mod mutabil/imutabil aceeași structură Foo - - `Arc>` - Permite mai multor pointeri inteligente abilitatea de a bloca împrumuturi temporare mutabile/imuabile într-un mod exclusiv al unui fir CPU. - - Detaliu de memorie: - - * Veți observa o temă cu multe dintre aceste combinații. Utilizarea unui tip de date imutabil (posibil deținut de mai mulți pointeri inteligenți) - pentru a modifica datele interne. Acesta este denumit ca modelul de „mutabilitate interioară” în Rust. Este un tipar - care ne permite să îndoim regulile de utilizare a memoriei în timpul execuției, cu același nivel de siguranță ca și - verificările lui Rust la timp de compilare. - code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=use%20std%3A%3Acell%3A%3ARefCell%3B%0Ause%20std%3A%3Arc%3A%3ARc%3B%0A%0Astruct%20Pie%20%7B%0A%20%20%20%20slices%3A%20u8%2C%0A%7D%0A%0Aimpl%20Pie%20%7B%0A%20%20%20%20fn%20eat_slice(%26mut%20self%2C%20name%3A%20%26str)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%20took%20a%20slice!%22%2C%20name)%3B%0A%20%20%20%20%20%20%20%20self.slices%20-%3D%201%3B%0A%20%20%20%20%7D%0A%7D%0A%0Astruct%20SeaCreature%20%7B%0A%20%20%20%20name%3A%20String%2C%0A%20%20%20%20pie%3A%20Rc%3CRefCell%3CPie%3E%3E%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20fn%20eat(%26self)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20use%20smart%20pointer%20to%20pie%20for%20a%20mutable%20borrow%0A%20%20%20%20%20%20%20%20let%20mut%20p%20%3D%20self.pie.borrow_mut()%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20take%20a%20bite!%0A%20%20%20%20%20%20%20%20p.eat_slice(%26self.name)%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20pie%20%3D%20Rc%3A%3Anew(RefCell%3A%3Anew(Pie%20%7B%20slices%3A%208%20%7D))%3B%0A%20%20%20%20%2F%2F%20ferris%20and%20sarah%20are%20given%20clones%20of%20smart%20pointer%20to%20pie%0A%20%20%20%20let%20ferris%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22ferris%22)%2C%0A%20%20%20%20%20%20%20%20pie%3A%20pie.clone()%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20sarah%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22sarah%22)%2C%0A%20%20%20%20%20%20%20%20pie%3A%20pie.clone()%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20ferris.eat()%3B%0A%20%20%20%20sarah.eat()%3B%0A%0A%20%20%20%20let%20p%20%3D%20pie.borrow()%3B%0A%20%20%20%20println!(%22%7B%7D%20slices%20left%22%2C%20p.slices)%3B%0A%7D%0A -- title: Concluzii - content_markdown: > - Pointerii inteligenți sunt expresiile de programare Rust și ne permite să nu recreem - modele foarte comune de utilizare a memoriei. Cu ele sunteți gata să abordați - cel mai dificile - - provocări! Acum că avem bazele Rust, hai să vorbim puțin despre - cum facem - - proiecte mai mari. În capitolul 9 ne eliberăm de o singură pagină de - - linii de cod. - From 34c57afb0fbe1f9dfe594b0539f9ac5c122d2de9 Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:28:14 +0000 Subject: [PATCH 05/10] Chapter 7 + 2021 debug + comments --- lessons/it/chapter_7.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml index d0b1857d2..131b1a858 100644 --- a/lessons/it/chapter_7.yaml +++ b/lessons/it/chapter_7.yaml @@ -138,7 +138,7 @@ I tratti possono ereditare metodi da altri tratti. - title: Invio dinamico e statico code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20static_make_noise(creature%3A%20%26SeaCreature)%20%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20dynamic_make_noise(noise_maker%3A%20%26dyn%20NoiseMaker)%20%7B%0A%20%20%20%20%2F%2F%20we%20don't%20know%20the%20real%20type%0A%20%20%20%20noise_maker.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20static_make_noise(%26creature)%3B%0A%20%20%20%20dynamic_make_noise(%26creature)%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+static_make_noise%28creature%3A+%26SeaCreature%29+%7B%0A++++%2F%2F+conosciamo+il+vero+tipo%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+dynamic_make_noise%28noise_maker%3A+%26dyn+NoiseMaker%29+%7B%0A++++%2F%2F+noi+no%0A++++%7D content_markdown: > I metodi vengono eseguiti in due modi: @@ -178,7 +178,7 @@ * Questo elenco di funzioni è noto in C++ come *vtable*. - title: Funzioni generiche code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20generic_make_noise%3CT%3E(creature%3A%20%26T)%0Awhere%0A%20%20%20%20T%3A%20NoiseMaker%2C%0A%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%20at%20compile-time%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20generic_make_noise(%26creature)%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_make_noise%3CT%3E%28creature%3A+%26T%29%0Awhere%0A++++T%3A+NoiseMaker%2C%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creature+%3D+SeaCreature+%7B%0A++++++++name%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++noise%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_make_noise%28%26creature%29%3B%0A%7D%0A content_markdown: > I generici in Rust lavorano di pari passo con i tratti. Quando descriviamo a tipo parametrizzato "T" possiamo limitare quali tipi @@ -208,7 +208,7 @@ eseguire l'invio statico e archiviarlo come valore dimensionato. - title: Abbreviazione di funzioni generiche code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20generic_make_noise(creature%3A%20%26impl%20NoiseMaker)%0A%7B%0A%20%20%20%20%2F%2F%20we%20know%20the%20real%20type%20at%20compile-time%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20generic_make_noise(%26creature)%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_make_noise%28creature%3A+%26impl+NoiseMaker%29%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creature+%3D+SeaCreature+%7B%0A++++++++name%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++noise%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_make_noise%28%26creature%29%3B%0A%7D%0A content_markdown: > Rust has a shorthand for expressing generics constrained by a trait: From b21721c1ec8a6a1194ca1c1e10584b448a1c8d3b Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Tue, 23 Jan 2024 11:11:32 +0000 Subject: [PATCH 06/10] Fixed Request --- lessons/it/chapter_7.yaml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml index 131b1a858..21e90b7c8 100644 --- a/lessons/it/chapter_7.yaml +++ b/lessons/it/chapter_7.yaml @@ -40,7 +40,7 @@ potrebbe non dispiacere questa mancanza. - title: Incapsulamento con metodi code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20creature.get_sound())%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++println%21%28%22%7B%7D%22%2C+creatura.ottieni_suono%28%29%29%3B%0A%7D%0A content_markdown: > Rust supporta il concetto di *oggetto* a cui è associata una struttura alcune funzioni (conosciute anche come *metodi*). @@ -68,7 +68,7 @@ ``` - title: Astrazione con esposizione selettiva code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20creature.get_sound())%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++println%21%28%22%7B%7D%22%2C+creatura.ottieni_suono%28%29%29%3B%0A%7D%0A content_markdown: > Rust può nascondere il funzionamento interno degli oggetti. @@ -80,7 +80,7 @@ La parola chiave "pub" espone campi e metodi della struttura all'esterno del modulo. - title: Polimorfismo con tratti code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_noise()%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A++++%0A++++fn+fare_molto_rumore%28%26self%29%7B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++%7D%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++creatura.fare_molto_rumore%28%29%3B%0A%7D%0A content_markdown: > Rust supporta il polimorfismo con i tratti. I tratti ci permettono di associare un insieme di metodi con un tipo struct. @@ -110,7 +110,7 @@ bloccare: - "ruggine". + ```rust impl MyTrait per MyStruct { fn foo(&self) { @@ -122,7 +122,7 @@ ``` - title: Metodi implementati sui tratti code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%20%20%20%20%0A%20%20%20%20fn%20make_alot_of_noise(%26self)%7B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_alot_of_noise()%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A++++%0A++++fn+fare_molto_rumore%28%26self%29%7B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++%7D%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++creatura.fare_molto_rumore%28%29%3B%0A%7D%0A content_markdown: > I tratti possono avere metodi implementati. @@ -133,12 +133,12 @@ essere utile per condividere il comportamento tra molti implementatori di tratti. - title: Eredità dei tratti code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Atrait%20LoudNoiseMaker%3A%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_alot_of_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%20%20%20%20self.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Aimpl%20LoudNoiseMaker%20for%20SeaCreature%20%7B%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20creature%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20creature.make_alot_of_noise()%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A%7D%0A%0Atrait+ForteRumoroso%3A+Rumoroso+%7B%0A++++fn+fare_molto_rumore%28%26self%29+%7B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++++++self.fare_rumore%28%29%3B%0A++++%7D%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Aimpl+ForteRumoroso+for+CreaturaMarina+%7B%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++creatura.fare_molto_rumore%28%29%3B%0A%7D%0A content_markdown: > I tratti possono ereditare metodi da altri tratti. - title: Invio dinamico e statico code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+static_make_noise%28creature%3A+%26SeaCreature%29+%7B%0A++++%2F%2F+conosciamo+il+vero+tipo%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+dynamic_make_noise%28noise_maker%3A+%26dyn+NoiseMaker%29+%7B%0A++++%2F%2F+noi+no%0A++++%7D + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+static_fare_rumore%28creatura%3A+%26CreaturaMarina%29+%7B%0A++++%2F%2F+conosciamo+il+vero+tipo%0A++++creatura.fare_rumore%28%29%3B%0A%7D%0A%0Afn+dynamic_fare_rumore%28rumoroso%3A+%26dyn+Rumoroso%29+%7B%0A++++%2F%2F+non+conosciamo+il+vero+tipo%0A++++rumoroso.fare_rumore%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++static_fare_rumore%28%26creatura%29%3B%0A++++dynamic_fare_rumore%28%26creatura%29%3B%0A%7D%0A content_markdown: > I metodi vengono eseguiti in due modi: @@ -178,7 +178,7 @@ * Questo elenco di funzioni è noto in C++ come *vtable*. - title: Funzioni generiche code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_make_noise%3CT%3E%28creature%3A+%26T%29%0Awhere%0A++++T%3A+NoiseMaker%2C%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creature+%3D+SeaCreature+%7B%0A++++++++name%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++noise%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_make_noise%28%26creature%29%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_fare_rumore%3CT%3E%28creatura%3A+%26T%29%0Awhere%0A++++T%3A+Rumoroso%2C%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creatura.fare_rumore%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_fare_rumore%28%26creatura%29%3B%0A%7D%0A content_markdown: > I generici in Rust lavorano di pari passo con i tratti. Quando descriviamo a tipo parametrizzato "T" possiamo limitare quali tipi @@ -208,21 +208,21 @@ eseguire l'invio statico e archiviarlo come valore dimensionato. - title: Abbreviazione di funzioni generiche code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+SeaCreature+%7B%0A++++pub+name%3A+String%2C%0A++++noise%3A+String%2C%0A%7D%0A%0Aimpl+SeaCreature+%7B%0A++++pub+fn+get_sound%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.noise%0A++++%7D%0A%7D%0A%0Atrait+NoiseMaker+%7B%0A++++fn+make_noise%28%26self%29%3B%0A%7D%0A%0Aimpl+NoiseMaker+for+SeaCreature+%7B%0A++++fn+make_noise%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.get_sound%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_make_noise%28creature%3A+%26impl+NoiseMaker%29%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creature.make_noise%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creature+%3D+SeaCreature+%7B%0A++++++++name%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++noise%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_make_noise%28%26creature%29%3B%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Afn+generic_fare_rumore%28creatura%3A+%26impl+Rumoroso%29%0A%7B%0A++++%2F%2F+conosciamo+il+tipo+reale+in+fase+di+compilazione%0A++++creatura.fare_rumore%28%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+creatura+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++generic_fare_rumore%28%26creatura%29%3B%0A%7D%0A content_markdown: > - Rust has a shorthand for expressing generics constrained by a trait: + Rust ha una scorciatoia per esprimere i generici vincolati da un tratto: ```rust - fn my_function(foo: impl Foo) { + fn mia_funzione(foo: impl Foo) { ... } ``` - This is equivalent to writing: + Ciò equivale a scrivere: ```rust - fn my_function(foo: T) - where + fn mia_funzione(foo: T) + Dove T:Foo { ... @@ -230,7 +230,7 @@ ``` - title: Box code: >- - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct%20SeaCreature%20%7B%0A%20%20%20%20pub%20name%3A%20String%2C%0A%20%20%20%20noise%3A%20String%2C%0A%7D%0A%0Aimpl%20SeaCreature%20%7B%0A%20%20%20%20pub%20fn%20get_sound(%26self)%20-%3E%20%26str%20%7B%0A%20%20%20%20%20%20%20%20%26self.noise%0A%20%20%20%20%7D%0A%7D%0A%0Atrait%20NoiseMaker%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%3B%0A%7D%0A%0Aimpl%20NoiseMaker%20for%20SeaCreature%20%7B%0A%20%20%20%20fn%20make_noise(%26self)%20%7B%0A%20%20%20%20%20%20%20%20println!(%22%7B%7D%22%2C%20%26self.get_sound())%3B%0A%20%20%20%20%7D%0A%7D%0A%0Astruct%20Ocean%20%7B%0A%20%20%20%20animals%3A%20Vec%3CBox%3Cdyn%20NoiseMaker%3E%3E%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%20name%3A%20String%3A%3Afrom(%22Ferris%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22blub%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20sarah%20%3D%20SeaCreature%20%7B%0A%20%20%20%20%20%20%20%20name%3A%20String%3A%3Afrom(%22Sarah%22)%2C%0A%20%20%20%20%20%20%20%20noise%3A%20String%3A%3Afrom(%22swish%22)%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20ocean%20%3D%20Ocean%20%7B%0A%20%20%20%20%20%20%20%20animals%3A%20vec!%5BBox%3A%3Anew(ferris)%2C%20Box%3A%3Anew(sarah)%5D%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20for%20a%20in%20ocean.animals.iter()%20%7B%0A%20%20%20%20%20%20%20%20a.make_noise()%3B%0A%20%20%20%20%7D%0A%7D%0A + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=struct+CreaturaMarina+%7B%0A++++pub+nome%3A+String%2C%0A++++rumore%3A+String%2C%0A%7D%0A%0Aimpl+CreaturaMarina+%7B%0A++++pub+fn+ottieni_suono%28%26self%29+-%3E+%26str+%7B%0A++++++++%26self.rumore%0A++++%7D%0A%7D%0A%0Atrait+Rumoroso+%7B%0A++++fn+fare_rumore%28%26self%29%3B%0A%7D%0A%0Aimpl+Rumoroso+for+CreaturaMarina+%7B%0A++++fn+fare_rumore%28%26self%29+%7B%0A++++++++println%21%28%22%7B%7D%22%2C+%26self.ottieni_suono%28%29%29%3B%0A++++%7D%0A%7D%0A%0Astruct+Oceano+%7B%0A++++animali%3A+Vec%3CBox%3Cdyn+Rumoroso%3E%3E%2C%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+ferris+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Ferris%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22blub%22%29%2C%0A++++%7D%3B%0A++++let+sarah+%3D+CreaturaMarina+%7B%0A++++++++nome%3A+String%3A%3Afrom%28%22Sarah%22%29%2C%0A++++++++rumore%3A+String%3A%3Afrom%28%22swish%22%29%2C%0A++++%7D%3B%0A++++let+oceano+%3D+Oceano+%7B%0A++++++++animali%3A+vec%21%5BBox%3A%3Anew%28ferris%29%2C+Box%3A%3Anew%28sarah%29%5D%2C%0A++++%7D%3B%0A++++for+a+in+oceano.animali.iter%28%29+%7B%0A++++++++a.fare_rumore%28%29%3B%0A++++%7D%0A%7D%0A content_markdown: > `Box` è una struttura dati che ci consente di spostare i nostri dati dallo stack a il mucchio. From 12fefda8ce657f36c21ac169c0c4c91844618b03 Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Tue, 23 Jan 2024 11:50:59 +0000 Subject: [PATCH 07/10] Translated Chapter 7 in Italian,Used 2021 Debug --- lessons/it/chapter_7.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml index 21e90b7c8..ea4257006 100644 --- a/lessons/it/chapter_7.yaml +++ b/lessons/it/chapter_7.yaml @@ -193,7 +193,7 @@ fn mia_funzione(foo: T) - Dove + where T:Foo { ... @@ -222,7 +222,7 @@ ```rust fn mia_funzione(foo: T) - Dove + where T:Foo { ... @@ -267,10 +267,10 @@ struct MiaStruct - Dove - T: Il mio tratto + where + T: MiaStruct { - piede + foo: T ... } From 2fe2114a4607ce658950fe0f394f3b6daa28dc6e Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:00:04 +0000 Subject: [PATCH 08/10] Requests fixed --- lessons/it/chapter_7.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml index ea4257006..9a9cdc7ef 100644 --- a/lessons/it/chapter_7.yaml +++ b/lessons/it/chapter_7.yaml @@ -58,7 +58,7 @@ ```rust - impl MyStruct { + impl MiaStruttura { ... fn foo(&self) { ... @@ -91,7 +91,7 @@ ``` - tratto Il mio tratto { + trait MiaCaratteristica { fn foo(&self); ... } @@ -112,7 +112,7 @@ ```rust - impl MyTrait per MyStruct { + impl MiaCaratteristica per MiaStruttura { fn foo(&self) { ... } @@ -265,10 +265,10 @@ ```rust - struct MiaStruct + struct MiaStruttura where - T: MiaStruct + T: MiaCaratteristica { foo: T ... @@ -283,7 +283,7 @@ ```rust - impl MiaStruct { + impl MiaStruttura { ... } From 37397249ab0c1f116fdf601dcff23db63249239b Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:18:42 +0000 Subject: [PATCH 09/10] Fixed yarn.lock --- yarn.lock | 88 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4ec078a3a..53cde66e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,7 +53,7 @@ acorn-jsx@^5.3.1: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn@^7.4.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -93,7 +93,14 @@ ansi-regex@^5.0.0: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -245,16 +252,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -317,6 +324,13 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" @@ -325,13 +339,6 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" @@ -451,7 +458,12 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -461,7 +473,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.26.0: +"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.16.0 || ^6.8.0 || ^7.2.0", eslint@^7.26.0: version "7.26.0" resolved "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz" integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg== @@ -537,7 +549,12 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estraverse@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -954,16 +971,16 @@ minimist@^1.2.0: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -1251,7 +1268,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -"semver@2 || 3 || 4 || 5", semver@^5.7.1: +semver@^5.7.1: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -1268,6 +1285,11 @@ semver@~7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -1339,7 +1361,16 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -1397,7 +1428,14 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== From 2c1b073b00171deda382634343a5fc6d09278e74 Mon Sep 17 00:00:00 2001 From: Gila Tiberiu Florin <118210644+tiberiugila@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:31:20 +0000 Subject: [PATCH 10/10] Fixed request --- lessons/it/chapter_7.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/it/chapter_7.yaml b/lessons/it/chapter_7.yaml index 9a9cdc7ef..d8fbfaa4b 100644 --- a/lessons/it/chapter_7.yaml +++ b/lessons/it/chapter_7.yaml @@ -283,7 +283,7 @@ ```rust - impl MiaStruttura { + impl MiaStruttura { ... }