Transcript for:
Webinar su Rust e Monadi: Panoramica

ciao benvenuti a tutti a questo webinar per chi non conosce Dove vedere È un'azienda che sviluppa software e hardware per molti settori industriali organizziamo numerosi eventi come webinar workshop ma anche conferenze come il Globo il roast Lab Tra l'altro di cui abbiamo un codice sconto per l'acquisto del biglietto del Libano e quindi rimanete connessi fino alla fine del webinar quando vi darò il codice Se volete rimanere Informati sui nostri prossimi eventi vi metto nella chat il link per l'iscrizione alla newsletter se avete domande potete usare la sezione q&a e alla fine Luca vi risponderà buon webinar a tutti e lascio la parola Lucani Aldi che ci parlerà di Rast Il filo rosso che unisce optional Resort e future Ma te la parola Luca Salve a tutti e spero mi sentite bene E sì questa quest'oggi parliamo di di Rast in particolare introdurremo qualcuno dei concetti diciamo base del di Rast per cui gli Option resalte le future però diciamo con l'idea di vedere un po' come sono effettivamente implementati e le motivazioni che che sono dietro al fatto che appunto Il Rast siano queste cose siano fatte in un determinato modo quindi un po' con l'idea di sia introdurre a chi non è familiare con Rust e quindi qualche concetto e sia dare fare delle informazioni in più o a chi già usar AST già conosce questo sarà diciamo la struttura della presentazione e quindi ci saranno diciamo una prima sezione introduttiva in cui produrremo il concetto di monade questo qui è la parte più diciamo un piccolo pezzo di parte teorica Perché diciamo spoiler allerta questi Il filo rosso di cui parla il titolo sono proprio le monadi cercherò di essere molto semplice anche perché non conosce questi concetti Anche perché io tra tutti Non sono un esperto di informatica teorica Dopodiché introdurremo diciamo i tre concetti quindi la gestione del nal la gestione degli errori e un po' di rastasincrono in cui vedremo diciamo queste questi tre concetti e come sono connessi con con le monadi e infine ci sarà un esempio pratico in cui metteremo un po' tutto insieme vedremo come si si può scrivere un piccolo programma sincrono che gestisce gli errori in maniera idiomatica in Rast e infine le conclusioni ehm qualche suggerimento qualche diciamo tips da portare a casa per per il futuro Quindi partiamo subito dal dalla parte diciamo complicata tra virgolette Va beh Lemonade per chi non le conoscesse o che non ha mai sentito parlare sono diventati famosi con con askal che è un linguaggio di programmazione funzionale e la parte importante diciamo la motivazione per cui sono diventati importanti e famose è perché permettono di poter di poter esprimere delle computazioni impure quindi che hanno a che fare con input output con socket Quindi con tutto ciò che che assai perfetto in maniera permette di poter gestire queste cose su un linguaggio funzionale che di fatto è puro diciamo per definizione Quindi come per esempio askell quindi in particolare Le Monache derivano dalla teoria delle categorie quindi sono un concetto matematico che poi è stato applicato successivamente al punto alla teoria del linguaggio e quindi poi è stato preso da varie linguaggi funzionali una morte diciamo per riconoscere una monade ci sono una serie di caratteristiche prometto che questo sarà molto sintetico e poi ci sarà anche un piccolo esempio le ci sono una serie di caratteristiche che fanno diciamo riconoscere una monade quindi una mole Per prima cosa deve avere un tipo quindi in questo caso MT significa una monete di tipo t serve un costruttore quindi un modo per creare una monade a partire da un tipo di base quindi per esempio unit che il nome classico per questo tipo di costruttore che da ti genera una funzione che dà T genera una monade DT e poi ci sono due funzioni importanti che normalmente sono videochiamate fmap e bind che poi vedremo diciamo nel tutto il resto della presentazione e l'fmap Sono entrambe funzionano al tuo livello cosiddetto ovvero che funzioni che prendono funzioni come parametro per cui la fmap a partire da una monaca prende una funzione che va da tiau E quindi che converte diciamo il tipo ti in un tipo u e quindi un'applicazione lfmap ritornerà un m.u quindi una mole di View labyrind È simile ma ha la differenza che la funzione che viene applicata ritorna una mole di View e quindi va independerà MT quindi una Maledetti una funzione che dà Attiva MV e ritornerà Alla fine un modo di per essere diciamo un pochettino più più chiari in realtà Le Monache di per sé Hanno solamente la funzione bind Dag Se da qui in poi diciamo considereremo tutte Perché di fatto le altre tre derivano dai futuri che è un altro concetto alla base però insomma non è non è fondamentale importanza da qui in poi diciamo consueremo Le Monache di tutto ciò che ha delle caratteristiche simili a questo e quindi cercheremo di riconoscere questa caratteristica nei vari concetti che che proporrò per cercare di dare un effetto una un approccio un pochettino più pragmatico alla cosa ho fatto un piccolo esempio utilizzando delle scatole e delle mele quindi consideriamo la monade come se fosse una scatola in cui ci posso mettere qualcosa e una mela che è un valore che può essere diciamo poi in programmazione potrebbe essere qualunque valore stringa intero che vi viene in mente Quindi diciamo il costruttore di una monaca qualcosa che mi permette dato una mela a costruire una scatola con dentro una mela quindi sarebbe la funzione unit di prima e poi ci sono le due operazioni partiamo da fmap fmap sarebbe una Un'operazione che dato una funzione che cambia il colore della mela quindi presa una mela verde me la trasforma in una vera rossa posso quindi presa questa funzione F e una monade per esempio appunto con una mela verde Posso applicare fmap per poter generare una davanti troppo per generare una una monade di una morte quindi una scatola con dentro una mela rossa quindi applicherà il cambio colore tra virgolette della mela alla mela che sta all'interno della scatola la stessa cosa una cosa simile avviene per bind con la differenza come avevo detto che la funzione bind Invece Partirà da una funzione G che date una colore verde trasformerà una mela darà una scatola con dentro una mela Quindi con una mela rossa quindi nello stesso modo applicando diciamo questa funzione G alla monade attraverso questa operazione bind avrò nello stesso modo una mela rossa quindi Qui la cosa che che c'è da notare è il fatto che non mi ritroverò con due scatole quindi c'è una sorta di Am wrap di una delle due scatole che è diciamo la parte importante di bind e vedremo poi che appunto è il fatto che rende le monadi molto utili in sui linguaggi di programmazione Detto ciò andiamo diciamo date queste basi iniziali andiamo un po' sul pragmatico quindi Cominciamo con con rasse i suoi concetti c'è da dire insomma inizialmente che Rast prende molti dei suoi concerti delle sue caratteristiche del linguaggio funzionali tra i quali appunto le monadi come vedremo ma anche loro Ship per esempio che è una delle parti diciamo fondamentali che di Rast che derivano dai tipi lineari e quindi comunque da un concetto informatico teorica detto ciò partirei subito con uno dei tre di cui avevo annunciato quindi gli Option gli Option di fatto servono per gestire il mal non si può parlare di nal senza citare tonor che è stato il programmatore dietro al gol uno dei diciamo primi linguaggi di programmazione da cui poi deriva c e tutti gli altri e della sua diciamo intervista Talk ormai un po' di tempo fa in cui citava L'invenzione del nalle della della funzione del puntatore Nullo diciamo della referenza nulla come uno dei più grossi errori che ha fatto nel sangue della sua vita Perché introducendolo in alcool è stato preso e portato fino a tutti i linguaggi moderni Dacci fino Giava Go e così via e quindi diciamo è interessante il fatto che poi altri linguaggi come altri linguaggi funzionali askell e poi Rast invece abbiano deciso di fare un approccio diverso che ora vediamo quindi l'approccio diverso è quello che non esiste il valore nulla come cioè molti linguaggi ma invece si usa un tipo speciale chiamato Option che serve per decodificare l'assenza di qualcosa quindi un Option di fatto è un è un un enume quindi un valore che può avere due stati quindi può avere uno stato None cioè qualcosa che non esiste oppure il valore Sam DT in cui ti è chiaramente il tipo ci metto dentro quindi uno posso fare un Option di tutti i tipi che voglio quindi nell'esempio c'è X e Y che sono due Option di tipo i32 e nel primo caso X prende Sum di 7 quindi è un valore diciamo valido cioè un qualcosa e quel valore 7 Nel secondo caso invece prende None quindi Y di fatto è un valore Nullo tra virgolette è un tipo Nullo al primo impressione può sembrare che è solo un modo diverso di ragionare e quindi in realtà il Nullo oceano si chiama None Però in realtà è in realtà è molto diverso perché prima cosa è diverso il default ovvero di default un valore sempre presente Quindi se ho una variabile di tipo di 32 che sarebbe un intero a 32 bit questa avrà sempre un valore non potrà mai avere nal come è possibile valore e quindi sposta un po' il problema nel senso che di fatto di default un valore è sempre valido e poi ci può essere il caso in cui lo dichiara Option perché vuole che effettivamente possa essere assente e la seconda cosa è un pochettino più sottile è la differenza tra un tipo e un valore cioè nulla è un valore e quindi non può essere controllato oppure Comunque più complicato controllarlo a livello diciamo di tipi quindi con l'analisi statica invece optional di fatto un tipo e quindi può essere diciamo controllato e cercato a Static Time attraverso la un'analisi statica Quindi Cambia un po' il concetto di come codifico la stessa cosa Quindi ora qui Vediamo se Option di fatto è una monade quindi Vediamo le varie caratteristiche avevo citato prima e vediamo come Queste si applicano a Option Quindi prima cosa ci serve un costruttore quindi per essere una monade Option ha bisogno di avere un costruttore che ha dato un tipo base quindi per esempio una stringa in questo esempio posso costruire un Option Champions League e il modo banale che faccio Sam con parentesi graffa e ciò che ci voglio mettere dentro detto questo dobbiamo vedere se esiste una funzione fmap quindi una funzione fmap che significa che data una funzione di partenza count per esempio che qui abbiamo che qui ho diciamo ho scritto come una funzione anonima questo diciamo perché non conoscerà sta e la sintassi di raster per fare una lambda quindi tra le parentesi diciamo le righe verticali ci sono i parametri quindi account sarà una funzione che prende una stringa e ritorno al numero che conta essenzialmente caratteri della della stringa Quindi dato questa funzione che vediamo che cambia colore la mela usando lo stesso approccio di prima posso utilizzare punto Map sull'option per poter applicare questa funzione all'option di partenza e in questo caso avrò come risultato 3 some di 3 perché effettivamente Contado quante lettere cioè nella parola som ora la seconda cosa che va con della terza cosa e va controllato per vedere se effettivamente l'option una monade è se esiste una funzione bind Quindi dato una funzione Double in questo caso che Moltiplica un numero quindi da un intero usato Moltiplica lo Raddoppia per due però qui c'è il piccola differenza ovvero non abbiamo fatto se vedete Double non Moltiplica semplicemente il numero per due Ma usano la funzione che è accecatel che è una funzione di Rast che permette di moltiplicare il numero ma controllando se c'è un overflow Quindi se c'è un overflow Non ritornerà un numero diciamo con l'over Flow ma ma ritornerà invece None quindi in questo caso questa Double è una funzione che va da un intero a un Option di intero perché potenzialmente potrebbe ritornare None quindi una scatola con una mela a questo punto l'operazione bind in nelle negli Option si chiama a un metodo punto enden Quindi se io faccio Option punto indenne della funzione sto effettivamente applicando una funzione bind e il risultato sarà 6 perché appunto era 3 lo moltiplico per per 2 e ho 6 in questo caso ha un valore valido Perché diciamo non ho fatto over Flow perché sei centra il 64 bit e detto ciò diciamo l'altro pezzetto che che iniziò a spiegare invece la gestione degli errori quindi abbiamo visto gli Option per la gestione del nal E ora parliamo appunto del degli errori Rast che anche qui è un approccio diverso che c'è per esempio in altri linguaggi come Go anche se è implementato in maniera diversa Comunque l'idea degli errori è quello di considerarli diciamo come valori quindi la filosofia è quella di non avere due Path separati quindi per esempio come con i tra i Catch l'eccezioni che sono invece noti su molti altri linguaggi ma invece utilizzare un valore in questo caso c'è una struttura che viene sempre definita dal linguaggio che è resalto e reset quindi è come per Option un enum quindi un tipo che può avere due diversi stati può avere o uno stato Ok in cui è tutto andato a buon fine e il valore all'interno è un tipo t oppure può avere Scusate può avere un tipo errore che avrà come diciamo tipo di ritorno her error che avrà come tipo di ritorno e quindi in questo caso posso per esempio nell'esempio dopo ho due variabili X e Y che sarà in un result di 32 String Questo significa che se tutto andrà bene ritornerò un intero a 32 bit Se tutto se invece qualcosa va storto ritornerò una stringa con per esempio l'errore quindi X viene creata con ok7 Quindi è un valore valido con dentro 7 Y invece è stata creata con un errore con un errore con dentro una stringa con scritto per esempio in vari Valium la differenza diciamo di questo approccio agli errori rispetto ai tre Catch è il fatto che comunque si utilizza lo stesso sistema le stesso modo di gestire i valori per gestire anche gli errori ovvero una funzione che mi ritorna un errore sarà una funzione che ritornare Salt e quindi non avrò un Pat separato per la gestione delle eccezioni che avrà bisogno di tutta una sua sintassi come trachee diciamo tutta una sua complessità nella gestione Ma posso utilizzare gli If I match tutto ciò che c'è nel diciamo nel mondo dei valori Quindi questo è il vantaggio principale anche qui come prima dobbiamo andiamo a verificare se risalta effettivamente una monaca e quindi se rispecchia quelle caratteristiche del delle monadi quindi uguale come per prediction vediamo per esempio partiamo dal costruttore quindi Esiste un costruttore che è partito da un tipo mi crea il resalto di quel tipo Sì l'abbiamo visto prima quindi noi vogliamo possiamo creare un re salte con Ok di un valore per esempio 17 questo punto resta avrà un re Salt con un risate tipo i32 error abbiamo deciso di usare questo error che sarebbe parso intero che Servirà poi per per il resto del dell'esempio Comunque non è non è non è troppo importante Una volta trovato il costruttore verifichiamo che c'è anche una funzione f-map che è un'altra caratteristica importante delle monadi Qui nell'esempio abbiamo per esempio partiamo da una toustring che è una funzione che preso un intero Mi genera una stringa quindi per esempio dai 32 è una stringa e per esempio possiamo vedere che per applicare come per gli Option una unf-map possiamo usare il metodo punto Map di resalta quindi le Salt punto Map to String mi darà un nuovo reset con una stringa e lo stesso intero di prima la underscore perché diciamo non è cambiato in qualche modo il risultato Quindi sarà vediamo nella assert che avremo adesso una stringa cioè avremo un re salto quindi ok con dentro una stringa di 17 la seconda la terza cosa dobbiamo andare a verificare invece se abbiamo una funzione bind per essere effettivamente una monade e la risposta è anche qui a si per esempio prendiamo una parsenam che è un'altra funzione che abbiamo definito che parte da una stringa e abbiamo e ritorna un re Salt di 8 per quale motivo per farsi vogliamo passare la stringa e avere un numero Chiaramente può avere un errore quindi il ritorno di parksnam sarà un re Salt in questo caso di 8 quindi sarà un numero 8 bit quindi la funzione userà from String per passare dalla stringa al all'intero e Però chiaramente può ritornare un possibile errore e quindi in questo caso possiamo fare Res punto enden che sarà l'applicazione della bind e la funzione parsenab come potete iniziare a intuire qui in qualche modo si vede effettivamente una sorta di questo enden da un senso di applicazione successiva quindi posso applicare una ricostruzione a qualcosa che potenzialmente ha un errore and then applico qualcos'altro che potenzialmente può dare un altro errore cioè in questo caso sto applicando una funzione fallibile perché il parziale un numero può essere fallibile e quindi diciamo anche il nome che resta utilizzato per la funzione bind questo enden da questa diciamo conseguenza di applichiamo cose che potenzialmente sono fallibili uno dopo l'altro detto ciò diciamo resalt è l'oggetto che gestisce questo stato di ok o error però gli errori hanno un modo che Rast propone per avere diciamo per essere codificati e in particolare diciamo il loro ciò che viene consigliato È quello di avere tipi specifici di errori per ogni ogni situazione quindi applicazione libreria e quant'altro e L'obiettivo è un'altra cosa diciamo importante che venga implementato il tratto il Trade che diciamo un'interfaccia perché non è avvezza al Rast error della standard library che di fatto offre un unico metodo che è il Source che permette di poter risalire all'errore originale Quindi se un errore W un altro errore è possibile diciamo scalare la catena di errori e l'altra cosa L'altra cosa importante è che gli errori debbano essere printabili Quindi devono implementare fmt fmt Display Quindi possono se vengono stampati devono avere un messaggio di errore diciamo questo più o meno è il modo con cui il Ras si definisce un errore cioè la parte che sta diciamo nel secondo campo del re saldo e l'altra parte un dettaglio importante che poi vedremo anche nell'esempio è il fatto che se tutte le librerie applicazioni hanno tipi di errori diversi ci servono modi per passare da un errore all'altro il modo più facile utilizzare mappe horror che è una funzione che viene sempre fornita Dai Re Salt che di fatto è una mappa però lavora al livello di errore quindi in questo esempio usiamo per esempio la mappa per passare da un errore di tipo maer 1 ha un errore di tipo ma error 2 quindi è possibile Res prima in un resalto I 32 ma euro l'uno e diventa poi un re Salt i32 ma error 2 e quindi un modo facile per poter passare un errore l'altro o wrappare un errore dentro un altro e così via detto ciò diciamo potrebbe sembrare tutto molto interessante però Quali sono i vantaggi cioè Quali sono i vantaggi di avere di Codificare alcuni di queste cose anzi di avere degli oggetti Che rispecchiano le caratteristiche delle monaci qui diciamo c'è una logismo che a me piace fare ma che diciamo non solo strettamente è stato il primo a farlo che le more di in qualche modo assomigliano al gatto di schroding cattolici Trading è diventato famoso con Big Bang Theory penso ma comunque è un una una un esperimento filosofico sull'idea di avere un gatto con che sta all'interno di una scatola con un con un veleno o una pozione un una capsula radioattiva e dall'esterno finché diciamo la scatola è chiusa non sappiamo se il gatto è vivo o morto perché potenzialmente in ogni momento si può rompere questa boccetta e quindi il gatto potrebbe essere morto quindi la parallelismo È simile perché le monadi hanno sono di sviluppo delle scatole come un analgismo delle mele sono delle scatole che contengono o un valore vero o un errore o valore Nullo no Quindi sono contemporaneamente servire che morte Cioè ne hanno sia un errore che non è un errore e quindi questo permette di avere un grosso vantaggio perché permette di ragionare esternamente al problema e considerare poi gli errori e le possibili situazioni più tardi È qui che inizia a essere interessante capire perché sul linguaggio funzionali sono molto utili quindi per esempio un esempio pratico se io ho una variabile null che è un Option posso comunque applicarci una mappa quindi posso comunque applicare una mappa in cui incremento il valore interno di uno anche se so effettivamente qui il livello statico che non però posso comunque farlo e non avrò un errore un Panic o qualcosa del genere semplicemente quando io andrò poi a leggere effettivamente il valore avrò un non e quella funzione che Ho applicato non sarà mai stato applicata quindi essendo non essendoci un valore effettivamente avere un +1 non ha nessun senso quindi questo ci permette di astrarre un po' e di distaccarci la possibili problemi che poi verranno controllati poi a un certo punto chiaramente quando poi mi serve il valore vero e proprio un'altra cosa importante del delle monading è il fatto che di fatto come avevo un po' iniziato a dire le fatto Le Monache ti permettono di poter esprimere la computazione sequenziale in un però in un linguaggio diciamo funzionale già ragionando a livello di funzioni di lambda Expression e quant'altro quindi nell'esempio a destra io avrò un Option che inizialmente è 7 dopodiché segue una serie di azioni Action 1 action 2 Action 3 in cui Conan danno proprio il senso della progressione cioè all options applico un'azione 1 che mi ritornerà un nuovo valore poi dopo di che a questo nuovo valore X riaprono la funzione 2 e così via se ognuna di queste funzioni a un certo punto fallisce e quindi ritorna a non di fatto interrompe la catena e avrò un nearly Return tra virgolette la cosa interessante è che con un po' di zucchero sintattico la cosiddetta ad un rotation in Ask in askal Praticamente posso trasformare questa cosa in un linguaggio imperativo in il Rast per esempio c'è il punto di domanda in questo modo per esempio questo pezzo di codice è esattamente uno a uno lo stesso lo stesso pezzo di codice sopra con la differenza che il secondo è molto più leggibile almeno dovrebbe Per quale motivo perché abbiamo effettivamente la sequenza come se fosse un codice imperativo quindi una sequenza dopo l'altra Quindi per esempio vediamo che OPT punto interrogativo Cosa significa Io sto dicendo che se Lot ha un valore Allora lo metto nella variabile X Se invece non ha un valore Quindi è un None ci sarà un erli Return quindi la funzione termina e esce e ritorno nane questa cosa qui permette effettivamente di applicare se vedete azione un'azione due azione 3 uno dopo l'altro in un in una sintassi operativa la cosa importante da notare è che la funzione fu non è a caso cioè il punto di domanda si può solo usare all'interno di una funzione questo per quale motivo perché dobbiamo comunque contenere il risultato Cioè alla fine il tipo della funzione esterno deve essere lo stesso quindi se vedete il risultato il tipo di ritorno di fu è lo stesso di OPT e questo diciamo una parte importante per far sì che questo questa strazione questo zucchero sintattico funzioni perché in qualunque momento posso fare un anello di retarne e la funzione può determinare Oltre a questo diciamo ci sono una serie di funzioni utili questo non è proprio propriamente sul fatto che siano delle monache ma il fatto che optional risalta abbiano delle buone attrazioni permette di avere anche delle funzioni per avere una buona integrabilità una con l'altra per esempio c'è la funzione ok o okore che permette di poter convertire un re-side in un Option e viceversa e questo diciamo permette di mappare un valore valido con un valore valido e poi None con errore o un errore con un None ora senza andare troppo nel dettaglio però sono utili diciamo da sapere nell'uso quotidiano l'altra cosa interessante per esempio la Collect che invece permette di poter invece estrarre diciamo la colletta una funzione molto molto diciamo usata in classe per poter collezionare un ideatore Quindi c'è un imperatore di qualcosa lo voglio collezionare una struttura dati che può essere una Snap una stringa un vettore e così via c'è la possibilità di poter collezionare un ideatore in un re Sal con l'interessante soluzione che riusciamo a apprendere diciamo gli errori tutti i possibili errori all'interno dell'imperatore nell'esempio specifico abbiamo un imperatore con una serie di result di cui uno di essi è un errore quando noi facciamo la collezione di questo Avremo un resalto e di vettore e Questo significa che il primo errore che viene trovata all'interno dell'imperatore fa un erli Return su tutta la costruzione della struttura e di fatto ritorniamo su l'errore e questo è molto comodo e fa vedere un po' di come di Quali sono i vantaggi effettivamente di avere lo stesso Pat lo stesso modo per gestire i valori e gli errori è un esempio proprio pragmatico di questo perché in questo caso riusciamo di fatto il resort non sono nient'altro che dei valori e quindi possiamo fare questo tipo di comportamento detto ciò ci avviciniamo una delle ultime sezioni per quanto riguarda il rasta sincrono Ora qui non voglio andare troppo nel dettaglio perché L'asta sincrona è un è una parte che è stato è una parte del linguaggio è stata aggiunta nel 2018 ha una serie diciamo di parti che entrano all'interno della standard library quindi sicuramente le future che vedremo e poi diciamo molta delle altre cose sono liberi esterne come per esempio Tokyo di cui si vedrà un pochettino sull'esempio e così via diciamo è un mondo molto grosso la parte che ci interessa è il come le futures sono state disegnate e diciamo come funzionano Quindi anche qui cerchiamo di focalizzarci su quel punto lì di fatto Cosa significa rastasincrono la sincrono significa avere una serie di operazioni che possono non che diciamo hai una sorta di promise Come chiamate anche in JavaScript in cui ha un oggetto che non è veramente il risultato però puoi potrebbe avere a un certo punto il risultato e questo ricorda un po' la scatola di Reading e quant'altro quindi la chiusura è un oggetto che tu puoi aspettare per avere il risultato E che sai che a un certo punto avrai il risultato e quindi sono molto utili in situazioni in cui uno vuole fare delle chiamate esterne una richiesta andatabase e così via quindi c'è una promise una feature di qualcosa che avverrà in futuro le future di fatto sono dei Trade Quindi devono estendere una feature deve estendere il Trade future all'interno dello Standard library ho messo qui diciamo il Trade quindi l'interfaccia e devono estendere ma non vorrei andare sul sui dettagli Anche perché normalmente nell'uso normale non ci si mette estendere un future a mano ma si usano quelli che già esistono nelle varie librerie però la cosa interessante evidente che un Trade Fusion definisce un Option Un output che è un tipo che rappresenta il tipo di ritorno al finale che avrà la Fusion una volta che viene attesa e che avrà risultato Pull è la funzione che noi non vedremo perché sta nascosta nel sistema però è quella che permette di capire di pullare la Fusion finché non c'è un risultato valido quindi ci sarà un esecutore uno scheduler per esempio Tokyo che continuerà a pullare la Fusion finché non avrà un risultato che sarà un valore le due parti del linguaggio che diciamo chiudere il 2018 E che di fatto permettono di utilizzare rastasincrono sono a Sync e await quindi con async si può creare un blocco o una funzione asincrona C'è un blocco una funzione che appunto può terminare a un certo punto e quindi che di fatto genera una Fusion come per esempio nell'esempio let food in cui Foot è una Fusion possiamo vedere che di tipo i32 Infatti output di fatto è i32 quindi Qui abbiamo creato una Sync che ha già un valore perché non aspetta niente Quindi il valore è subito disponibile di appunto i 32 di un di uno la seconda keyword è importante è await che permette di aspettare di attendere una Fusion quindi per esempio data la Fusion FUT posso fare FUT punta Wait e aspetto che la Fusion finisce nel nostro caso è immediato perché appunto il valore sta subito lì e avrò X che è il risultato a quel punto x cioè quella Sert X sarà chiaramente uguale a 1 Quindi questi qui sono due parti del linguaggio che di fatto integrano diciamo con con le future quindi resta sempre non è solamente una cosa di libreria diciamo ci sono anche parti del linguaggio anche qui ci giriamo la stessa cosa di tutte le slide precedenti Quindi Dobbiamo verificare che future è una monade quindi vedremo di nuovo le varie caratteristiche per vedere se effettivamente le future sono una monaca in particolare Quindi partiamo dal costruttore come abbiamo fatto fino adesso e quindi ci serve un costruttore che dobbiamo vedere se esiste un costruttore che ha dato un tipo diciamo base ci permette di poter costruire una Fusion su quel tipo e abbiamo già visto come si fa no Quindi con il blocco a Sync di fatto un modo per creare una feature quindi posso fare a Sync di stringa Luca e sto creando una feature che all'interno di tipo stringa cioè che all'interno avrà una stringa a questo punto dobbiamo chiederci se esiste la funzione fmap quindi partendo da una funzione per esempio Upper che trasforma in app arcase tutta la stringa Quindi sarà una funzione che parte da una stringa e ritorna un'altra stringa tutta maiuscola possiamo applicare la funzione attraverso punto Map che diciamo allo stesso modo che ci sono in options per cui applicheremo alla Fusion punto mappa per ci permetterà di una volta che la Fusion sarà terminata Quindi prima la feature dovrà essere terminata Ma noi questo non lo sappiamo ce la aggiungiamo di fatto no Alla fine quando il valore C'è verrà poi trasformato in happer però per noi è trasparente alla fine avremo una nuova Fusion che sappiamo che alla fine a un certo punto diventerà perché qualunque cosa essa ci sia dentro infine Dobbiamo verificare che esista un'operazione bind su sulle monadi sulle future e quindi questa volta però la funzione bind essendo aver deve partire una funzione che parte da un tipo base ovvero stringa e deve ritornare una Fusion di stringa quindi per esempio abbiamo creato una funzione Fire Che aggiunge attraverso il formato aggiunge delle un emoticon di fuoco prima e dopo il nome però la differenza è che come possiamo vedere ritornerà di nuovo una Sync perché in questo caso prende una stringa e ritorna una Fusion di una stringa con un valore sempre valido ora potete ignorare il move diciamo se serve in questo contesto però non è non è fondamentale quindi di fatto Fire permette di prendere una stringa e aggiunge e aspetta diciamo il risultato e applica una successiva Fusion quindi un qualcos'altro che potenzialmente può essere asincrono può essere una chiamata database può essere una cosa esterna in questo caso di nuovo È un valore che subito disponibile quindi questo caso la bind l'operazione bind non sarà enden come su optional per qualche motivo l'hanno chiamata Den Quindi abbiamo futures Fire e diciamo esprime proprio il concetto di prima finisce la Fusion Dopodiché Eseguo quest'altra feature quindi di questa trasformazione asincrona quindi qui sarà una trasformazione sincrona la cosa interessante è che un po' mentito all'inizio perché a wet Di fatto si aspetta una Fusion però di fatto è anche questo è uno zucchero sintattico Perché await di fatto era ad un rotation delle future quindi è come se fosse il punto interrogativo per options Per quale motivo di fatto permette di poter trasformare una sequenza di applicazioni sempre funzionali di punto Den Quindi se ho una funzione un punto Den di Fusion uno dopo l'altro li posso trasformare in codice imperativo attraverso il punta Wait quindi di fatto è semplicemente di nuovo uno zucchero sintattico del linguaggio quindi partendo dall'esempio di prima se io Fire che questa funzione che da una stringa ritorna una Fusion di una stringa avevo diciamo il caso di poter fare punto Den per applicarla ma posso anche fare questa cosa posso anche per esempio utilizzare punta Wait Quindi abbiamo future punta Wait mi ritornerà un valore che una stringa e a quel punto posso usare X per posso fare Fire DX per applicare diciamo Fire a X come valore e di nuovo aspettare il valore la cosa interessante qui è il fatto che c'è un blocco a Sync Per quale motivo è la stessa identica cosa che c'era sul punto interrogativo Come punto interrogativo lo poteva applicare solamente su una funzione che ritornavano un re Salt o un optional anche qui il punto await lo posso utilizzare in un blocco che è dello stesso tipo e quindi che è un blocco asincrono una funzione asincro non è questo è una cosa che avrete notato perché ho usato a giallast che quando ho iniziato a usare async dovete iniziare a trasformare tutto in async e la motivazione è proprio questa perché il punto away da senso se il tipo il blocco esterno rimane dello stesso tipo di ciò a cui sto applicando la weight e quindi l'esterno dovrà sempre essere una feature come le cose all'interno Perché c'è sempre l'ideale Insomma di unirli Return per concludere abbiamo diciamo l'ultima parte della della presentazione in cui farò vedere un po' tutto ciò che abbiamo visto quindi l'opzione resa dei future su un esempio che in maniera tale da poter vedere un po' Come come si mette tutto quanto insieme in qualche modo e le questo diciamo l'esempio un piccolo programma in cui si vede un po' la gestione degli errori ma ci stanno anche un po' di future e di asincrono e il programma è molto facile Cioè ha dato un file per esempio txt in cui c'è Nome virgola cognome dobbiamo fare un programma che crea Diciamo che crea una struttura persona che avrà né in nessun nemico quindi il primo sarà il nome e il secondo sarà il surname c'è Ho messo anche il link in cui è disponibile diciamo il codice di tutto l'esempio che è molto facile ma ci sono un po' tutte le versioni che vedremo E allora gli obiettivi diciamo del programma sono prima cosa vedere un po' Come gestire gli errori in maniera idiomatica in Rast si è deciso dell'approccio di un approccio statico quindi la gestione degli errori in maniera statica che è uno degli approcci in realtà ci sono altri modi per poterli gestire sia direttamente come stringhe come sugo oppure con i ricercatori però diciamo mi sembrava più coerente col resto della presentazione far vedere questo questo tipo di approccio e secondo modo secondo punto è quello di far vedere la differenza tra le varie tra lo zucchero sintattico diciamo e le funzioni originali quindi confrontare enden come binding Operation per options e future con lo zucchero sintattico del punto interrogativo e della weight quindi vedere un po' le differenze tra tra i due come di fatto lo zucchero sintattico sia sicuramente più utile in tanti aspetti l'ultima cosa vedremo anche come usare una libreria che consiglio che è di serrar per generare buona parte del codice che vediamo e quindi semplificare molto diciamo tutto ciò che che bisogna scrivere di fatto per avere questa cosa funzionante Allora quindi partiamo dal dal principio vogliamo diciamo costruire questo questo oggetto persona quindi il modo che ho che ho fatto è quello di implementare il Trade from str come vediamo a sinistra implementiamo il metodo frame str che è della standard library è un Trade che offre un metodo che si chiama from String che serve proprio per trasformare una stringa in un tuo tipo personale un tuo un tuo tipo che in questo caso è persa e persona quindi abbiamo implementato from String per persona e quindi dobbiamo implementare il nostro frame str ora la cosa comoda di questa di from stringa per cui Insomma l'ho proposto e lo consiglio è il fatto che from stringhe o anche utilizzato dalla funzione parse che sta delle stringhe per cui come nell'esempio a destra diciamo devo fatto un piccolo esempio di main vedete che possiamo creare a partire da una stringa txt possiamo creare l'oggetto persona in due modi O usando direttamente del metodo from String quello che abbiamo definito a sinistra oppure facendo txt punto parts quindi usando il metodo parts della stringa per poter creare diciamo l'oggetto persona chiaramente dobbiamo suggerire Qual è il tipo P risultante perché potrebbe essere qualunque cosa Questo è lo stesso modo con cui magari si può partare un numero e così via quindi nel codice adesso per dare un una scorsa veloce L'idea è quella L'abbiamo usato lo split per dividere diciamo la stringa alla virgola quindi quello genererà un imperatore che è It A questo punto usiamo punto Next per prendere il primo valore che sarà il nome punto Next ancora per prendere il secondo valore che è il surname e infine verifichiamo che non ci sono più altri valore quindi che punto Next ritorna None e in quel caso se invece ritorna Sum quindi opposto ritorniamo un errore Ora la parte interessante che abbiamo usato per esempio Ok error che è quella funzione per trasformare Option in lavoratori perché Next ritorno un options vogliamo convertirlo in un errore e quindi facciamo ok punto ok or e passiamo L'errore che vogliamo ritornare che in questo caso è perso un error di tipo pars Poi vedremo come implementato personnel e infine c'è il punto di domanda perché vogliamo fare un retarne cioè in questo caso se c'è un errore quindi se non c'è per esempio il primo campo sull'oratore vogliamo ritornare direttamente l'errore quindi un Harley Return con l'errore surname la stessa cosa Nel caso diciamo nell'ultimo ritorniamo semplicemente error person parts e infine se tutto va bene ritorniamo un ok con dentro la persona l'oggetto persona creato a questo punto persone error è vediamo come è fatto diciamo l'errore quindi persone error è un enum questo diciamo l'approccio di vedere gli errori statici ovvero noi definiamo una variante per ognuno dei possibili tipi che possiamo ritornare quindi in questo caso specifico possiamo ritornare tre tipi diversi di errore o un aglio error in caso leggiamo un file che non esiste o da un errore proprio a livello di lettura del file io e in questo caso vediamo che nella variante contiene aglio error che è il tipo della standard library Quindi wrappiamo l'errore della standard library poi abbiamo un tf8 error che è un errore Se non riusciamo a convertire la Rei di binari che leggiamo sul file in una stringa tf8 valida e qui from tf8 error è il tipo della standard Library anche qui che useremo poi e infine pars nel caso è un errore nostro che è quello che ritorniamo anche prima quindi è un errore sul caso che è tutto va tutto bene però in realtà il formato è sbagliato Ci sono tre virgole non c'è una nessuna virgola il file è vuoto cose di questo genere quindi non rispetta il nostro formato ora rispetto a quello che vi avevo suggerito dobbiamo anche all'inizio diciamo come si gestivano gli errori dobbiamo anche implementare fmt display in maniera tale che quando stampiamo questo errore o facciamo un Touring o lo usiamo in una Print o in qualcosa di questo genere ritorniamo il messaggio quindi in questo caso abbiamo messo fmt display l'implementazione avrà un match all'interno a seconda del tipo di errore risultato Quindi io erro il tf8r robars ritorneremo un messaggio errore diverso quindi che hanno tre file nel caso della io error nota balli String invalid per sot Format e così via potete notare che ho messo due punti e l'errore di partenza per concatenare un po' come faingo anche se non è proprio idiomatico di Rast concatenare i vari diciamo l'errore interno quindi quello da io o quello di un tf8 error Infine abbiamo implementato anche queste due cose che sono molto utili quindi sono il from per poter che anche questo è un Trader standard per poter avere un modo veloce per convertire una io error o un from to F8 error nel nostro tipo quindi a partire da un tipo della standard errore che ci arriva dal basso tra virgolette con implementando il metodo from possiamo generare il nostro errore quindi che sarà brappando di fatto l'errore risulta l'errore Diciamo che ci arriva nel nostro tipo specifico vedremo perché è utile è importante questa cosa detto ciò vediamo la parte incorre diciamo di tutto quindi una funzione Rip person questa qui è un'implementazione che ho voluto fare esplicitamente più complessa di quello che normalmente sia per fare un esempio di una funzione come se fosse tutto in maniera funzionale Cioè se non uso nessuno zucchero sintattico che mi offre Rust di nessun tipo dovrei scrivere una funzione in questo modo stiamo nel mondo sincrono quindi RID person è una funzione che prende un Pat quindi che prende il patto del file leggerà l'errore l'errore Scusate leggerà il file e ritornerà una Fusion perché leggiamo con Tokyo quindi una lettura sincrona ritornerà una Fusion che ha il suo interno avrà un resalto che può essere o persona o persona error Quindi questa all'interno possiamo vedere che la prima cosa che facciamo è usare Tokyo FS RID per leggere il file questo ci ritornerà una Fusion la Fusion ci attacchiamo con punto Map dicendo appena che qualunque cosa sia disponibile agganciaci tutta quest'altra funzione nella funzione Map Dovremmo fare una conversione di ciò che era il vettore Diciamo che ci arriva al vettore di Byte nel l'oggetto persona quindi prima cosa convertiamo il R il risultato nel nostro tipo quindi usiamo mappe horror per dire se ci fosse un errore io lo convertiamo in persot Format con perset Format perso un Format Scusate perso mai errore from dopo di questo applicheremo un enden Perché a partire dalla stringa di Byte vogliamo generare una stringa quindi utilizzeremo from tf8 anche qui vogliamo dire che l'errore che viene ritornato a from tf8 lo riconvertiamo al nostro errore specifico e infine abbiamo applicheremo Person of String così che dalla da una stringa ritorneremo di fatto un ritorneremo un oggetto tipo persona tutto questo poi di fatto una Fusion che verrà ritornata la funzione ora chiaramente questa cosa è abbastanza contorta e complessa Ma appunto ci viene in aiuto lo zucchero sintattico quindi quella funzione di prima attraverso lo zucchero sintattico di Huawei e punto interrogativo diventa la seguente molto più leggibile quindi prima cosa abbiamo messo a Sync prima di FN quindi in questo modo Stiamo definendo una funzione asincrona e questo ci permette di togliere dedicarci la parte della Fusion Quindi è una funzione asincrona che ritorna un resalto che può essere persona o persone e quindi qui oggi abbiamo semplificato molte cose la seconda parte è che possiamo usare a questo punto stando in un blocco a Sync possiamo usare anche await quindi quando faremo leggiamo il file con la RID possiamo fare punta Wait per aspettare che abbiamo la Ready Byte a quel punto usiamo punto interrogativo perché se c'è stato un errore sulla Reed vogliamo ritornare subito in caso contrario in B ci sarà il vettore di Byte a questo punto useremo from tf8 per generare la stringa a partire dai Byte anche qui se c'è un errore facciamo e ritorniamo a questo per finire useremo persa un Prom String dalla stringa S per poter generare persone a quel punto abbiamo Ok IP perché ritorniamo un valore valido quindi se tutto quanto è andato a buon fine tutta la serie di Passion Da buon fine ritorniamo un valido e diciamo abbiamo l'oggetto finale detto ciò diciamo questa è l'ultima parte in cui volevo far vedere diserrror senza diciamo andare troppo nei dettagli però volevo far vedere che utilizzando questa libreria A patto di leggere una serie di Macro e cancelletti so che magari che perché non è esperto in classe può sembrare più complicato di quello che in realtà è Però possiamo di fatto mettere questa serie di Macro su persone error che era L'errore che abbiamo definito a inizio per poter lasciare a disarro l'implementazione di tutti i from per le conversioni hanno detto una cosa importante il punto interrogativo che era la parte utile il punto interrogativo fa anche la conversione in automatico dell'errore da il tipo base al nostro tipo perso nerror e infatti come notate non c'è non ho dovuto mettere mapperror da nessuna parte quindi è per quello che è utile implementare I from di prima quindi qui diciamo già in automatico una conversione attraverso il Trade from quindi appunto ritornando aggiungendo diciamo il drive macro di Serra or error aggiungendo questi from che ci permettono di poter dire alle librerie implementa il from in automatico e in più gli errori diciamo il messaggio d'errore lo possiamo scrivere direttamente sopra la variante con questa macro error in questo modo non dobbiamo implementare fmt display e in tutto quel modo possiamo semplicemente mettere una stringa e qui con parentesi graffe Zero implica con catenaci il primo valore Diciamo che quindi in questo caso è l'errore Quindi avremo cannotto di deror e poi la stringa risultato dell'errore interno e così via è molto utile chiaramente per gestire gli errori più complessi siamo arrivati quindi alla conclusione e Prima diciamo di lasciarci poi alle domande volevo riassumere un po' di concetti che che premeva Diciamo che in qualche modo magari di trasmettervi e che poi possono essere utili Secondo me come come informazione Quando poi uno scriverà sta in maniera più efficiente quindi diciamo prima cosa negli optional Resort Map serve per applicare una trasformazione non fallibile quindi una trasformazione che non potrà fallire non potrà ritornare un non potrà ritornare un errore enden invece serve per applicare delle trasformazioni infallibili Quindi ogni volta che avrò una serie di operazioni che possono a un certo punto fallire poi abbiamo che enden può essere convertito in un blocco di punto interrogativo e viceversa quindi abbiamo questa questa connessione tra enden e punto interrogativo e poi invece per quanto riguarda abbiamo imparato che il Den combina più compilazione computazione asincrone Quindi è possibile concatenare computazioni asincrone await è la stessa cosa il punto interrogativo quindi di fatto è uno zucchero sintattico per la funzione bind delle monadier e infine che appunto Il Den può essere convertito in un blocco di await e quindi anche qui c'è la conversione da una parte all'altra per usare o una sintassi operativa con la Wait oppure una sintassi più funzionale con i Dem ho lasciato qui diciamo soprattutto se volete poi distribueremo le slide quindi ci sono i link diciamo di un po' di fonti che ho utilizzato il libro molto interessante categoria che diciamo parla un po' della parte più teorica iniziale e poi ci sono un po' più di articoli divulgativi e poi anche degli articoli specifici diciamo Monet Rast così via soprattutto gli ultimi due Grazie dell'attenzione e siamo arrivati alla parte delle domande se ce ne sono sono ancora un po' qui non siate timidi ragazzi rientrano anch'io nella nella descrizione se avete qualche domanda potete scriverla sia in chat che nella sezione q&a negli zoom così possiamo approfittare delle conoscenze di Luca per approfondire gli argomenti che ci ha spiegato decisamente bene e vi lascio un po' di tempo per vedere se avete qualche domanda intanto faccio i complimenti a Luca per la serata Ah eccoci guarda [Musica] Ma si possono creare nuove monadi tramite l'alimentazione di un numero di trades che è Luca Allora di fatto le monadi di per sé appunto come abbiamo visto è un concetto Quindi qualunque cosa che rispecchia quelle caratteristiche di fatto è una monade cioè una monaca per esserci deve avere quella caratteristica che sono il costruttore la funzione acque Map bind e così via poi ci sono anche delle proprietà che ho diciamo Non considerate Ma bisogna anche dimostrare che una cosa è una monade ci sono una serie di proprietà che vanno dimostrate però Di fatto si cioè si possono creare Moneti e sono state create monete per esempio tanti altri linguaggi sono esempi per esempio in Java in cui costruisce te costruisce una monache poi il vantaggio di Rast è il fatto che ci sono una serie di zucchero sintattico di aiuti per esempio glienam aiutano molto nel nella costruzione delle monache quindi c'è una serie di aiuti intorno proprio del linguaggio che rende molto facile creare e utilizzare Le Monache di Rast rispetto magari ad altri linguaggi in cui devo fare un'implementazione più convoluta e non ho un supporto diciamo non so se questo è un po' il punto Ok registrazione Penso di sì no sì Claudio chiedevo se era possibile riascoltare il webinar se il webinar è stato stremato su varie piattaforme verrà caricato su YouTube a posteriori quindi importante riascoltare tutto tranquillamente Maura aveva iniziato a scrivere una frase ma se è rimasta tagliata a metà semmai la può raggiungere in chat non so bene sono un grande esperto e questo è uno zoom ok bene sono ci sono altre domande Luca puoi andare avanti e come vi dicevo prima la deve avere organizza anche conferenze tra queste c'è il roslab Quest'anno si farà da 19 al 21 novembre al Grand Hotel Mediterraneo Firenze e niente un'organizzazione sul Roster organizzato la tepler quest'anno verrà effettuata assieme al globulab quindi l'esperienza dei due conferenze al prezzo di uno e se volete comprare il biglietto avete uno sconto sul livello di del 10% con il codice che c'è scritto nella slide DTL 10w iPhone Mauro ha rischiato la domanda io il programma Incy Sharp e vorrei iniziare a programmare il Rast Qual è la curva di apprendimento eh Questa è la domanda delle domande allora c'è sicuramente Cioè non bisogna negare il fatto che il Ras ci sia una curva di apprendimento un po' almeno all'inizio un pochettino ardua bisogna Insomma metterci un po' di fatto la complessità Secondo me del di Rast in particolare che è più facile a mio avviso se uno viene da un linguaggio dal linguaggio Diciamo in cui bisogna gestire la memoria a mano quindi sicuramente se uno viene la C più più se viene da C da diciamo linguaggi senza Garbage collector secondo me è più facile diciamo approcciarsi al Rast ma dall'altra parte come abbiamo visto anche su questa presentazione ci sono tantissimo zucchero si specifico aiuti una anche una documentazione ben fatta diciamo sul sito che c'è questo approccio molto funzionale e quindi molte molte delle cose che magari possono sembrare complesse in realtà hanno delle soluzioni più pratiche più semplici e quindi diciamo potenzialmente anche ci sono anche molte connessioni per esempio con Python per dire no adesso io ci sciarpa nel particolare non lo conosco troppo però diciamo la parte sicuramente più più complessa e un po' capire la gestione della memoria Secondo me come Primo scoglio Perché diciamo Russano linguaggio Adesso per chi non lo sapesse che non ha un Garbage collector Però dall'altra parte da attraverso l'onere Ship che è una regola principale diciamo di Rast evita anche che uno deve ricordarsi di fare le free a tutte le cose che all'Oca quindi diciamo ti aiuta Però dall'altra parte avere chiaro di dove le cose siano aiuta sicuramente consiglio comunque la il rastbook mi sembra che si chiama che è molto molto facile per iniziare a fare diciamo pezzo per pezzo le prime parti sempre Mauro a chiedere anche sì allora in realtà non l'ho detto Però denner sulle future sono di fatto implementate su non solo implementare sulla standard library standard library implementa solamente il Trade future liscio Cioè senza niente poi c'è una ci sono due librerie che più o meno sono uguali appunto cioè future RS quella lì che si chiama future però basta su Diciamo solo le importa Oppure anche futures che sono diciamo implementano quelle due quei due metodi di fatto però Sì diciamo sono sono utili Sì quelle due librerie la domanda a cui ha risposto Luca ha sposato non può vederla e per usare appunto gialla e punto Map sui future servono una libreria tipo features è un'altra domanda di Mauro chiederò appunto per quali progetti ambiti consigli l'uso di Rast e anche questa è la domanda delle domande che viene sempre chiesta Allora devo ammettere che io da fanboy direi tutto però chiaramente diciamo Ci sono situazioni diverse nel senso se uno scriverà sta da tanto riesce a fare anche prototipazione per dire il Rast Cioè a me mi sta più semplice scrivere una cosa Il Rast che che in Python però per esempio se uno deve fare la propria situazione chiaramente linguaggi dinamici Python JavaScript saranno sicuramente più facile negli ambiti progetti Secondo me ultimamente va molto secondo me anche nel mondo dei web server che era arrivato un po' più piano perché diciamo si confronta col linguaggio magari come Go come Java e quant'altro che stanno lì da sempre però per esempio adesso con librerie come per esempio axum che consiglio che diciamo dagli stessi di Tokyo si può fare in maniera molto veloce e comunque funzionale anche the web server poi tutto ciò che si sta nella valle language cioè tutti quegli ambiti in cui vorresti usare CC più perché vuoi una cosa molto veloce efficiente che tocca il sistema operativo che fa diciamo un gestione della memoria a basso livello e lì chiaramente Rast diciamo l'essenza neanche dirlo cioè lì è proprio il suo Dopodiché ci sono questi altri ambienti come per esempio i servizi il cloud in cui sta apparendo col fatto di avere un sistema di tipi molto diciamo una sistematina molto stabile con molte funzionalità e quindi diciamo è utile è utile anche quei contesti lì per non parlare il gioco tutte le garanzie da Safety da dareis e così via Grazie anche per questa risposta Luca [Musica] altri complimenti e grazie mille a tutti e niente Grazie per aver seguito questo webinar tutti quanti i nostri contatti però poi andare più avanti aspetta [Musica] puoi leggerla tu [Musica] Sì sono sostanzialmente Claudio che era aiuti sulla l'utilizzo della documentazione per approfondire il linguaggio diciamo Allora non ho diciamo non ho suggerimenti particolari diciamo Sì il libro quello rastbook si ci sta che è un po' un'introduzione spiega molti concetti e poi non arriva il suggerimento come Rust come tante come qualunque linguaggio nuovo con uno vuole imparare è fare [Musica] divertirsi Cioè nel senso costruire un inventarsi un qualche progetto che può essere magari un progetto che uno ha fatto in un altro linguaggio e dire lo rifaccio pure qualche cosa che magari già esiste poi a seconda dell'ambito in cui uno interessato consiglio un po' quello cioè cercare magari di rifare dei progetti vecchi o inventarsi dei progetti che magari non è devono essere super interessanti Però solamente per usare un po' il linguaggio Insomma Ecco questo è un po' il consiglio un'altra domanda di Alessio e che sta lavorando su un web server con Amazon e volevo sapere essere consigliabile usare il Presumo cast insieme ai miei GX però non è necessario Ah no vorrebbe usare Sì non ho una risposta diciamo questo è più una cosa a livello di poi di The Box di deploy diciamo dell'applicativo secondo me enjoyx ci sta sempre nel senso come poi dopo Dipende dal contesto dal dalla situazione qual è il design delle Infrastrutture in generale però diciamo sì consiglio comunque potenzialmente usarlo come schermatura esterna e diciamo come Reverse proxy di base il fatto che sia necessario No non saprei o restare La risposta non è necessario chiaramente però poi Dipende dalle situazioni Ok in italiano mi sono perso ero sempre sedi di lifetime è il lifetime sono un bel problema anche lì Secondo me lo stesso lo stesso lo stesso fatto i lifetime li capisci quando è un problema Quindi quando il compilatore si arrabbia tu non riesci andare avanti Cerchi cerchi e poi risolvi con lifetime Quindi anche lì forse la avevo risposto tra virgolette come avrei risposto adesso avevo capito anche lì avere un progetto provare a lavorare su delle cose ti fa poi e poi c'è da dire In realtà grande scoglio diciamo di Rast con i vari aggiornamenti di Rast del linguaggio ci sono sempre meno situazioni in cui effettivamente devi esprimere un lifetime anche lì sui lifetime conoscere linguaggi che hanno una gestione della memoria più a basso livello come CC più anche li aiuta per esempio non mi è capitato che dopo software ho imparato Rast e quindi imparate divertenti su Rast quando ritorno in c++ lo capisci meglio perché effettivamente sono gli stessi concetti È solo che su rasta è un modo esplicito per poter dire delle cose sul c++ devi più o meno ricordarteli a mente Quindi direi applicazione anche qui sì trovare non ho altri consigli fortunatamente direi che ci siamo ancora mille grazie Luca per questo approfondimento al vostro cast e questi sono i contatti di Luca lucari arrivano ad aver lasciato.com e per qualsiasi altra curiosità c'è trovato su tutti i social Facebook Twitter Grazie mille a tutti per questa serata e ci vediamo alla prossima