{"id":29846,"date":"2019-10-31T21:32:19","date_gmt":"2019-10-31T18:32:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\/"},"modified":"2019-10-31T21:32:19","modified_gmt":"2019-10-31T18:32:19","slug":"igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Giocare a Rust in 24 ore: esperienza personale di sviluppo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Giocare a Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo articolo condivider\u00f2 la mia esperienza nello sviluppo di un piccolo gioco su Rust. Ci sono volute circa 24 ore per creare una versione funzionante (principalmente ho lavorato la sera o nel fine settimana). Il gioco \u00e8 ancora lontano dal completamento, ma credo che l'esperienza sar\u00e0 utile. Condivider\u00f2 ci\u00f2 che ho imparato e alcune osservazioni fatte durante la costruzione del gioco da zero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox consiglia:<\/b> Corso pratico di due anni <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=rust24\">\u00abIo sono uno sviluppatore web PRO\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Ricordiamo:<\/b> <i>per tutti i lettori di \u00abHabr\u00bb \u2014 sconto di 10.000 rubli per l'iscrizione a qualsiasi corso Skillbox con il codice promozionale \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Perch\u00e9 Rust?<\/h3>\n<p>\nHo scelto questo linguaggio perch\u00e9 ho sentito molte cose positive al riguardo e vedo che diventa sempre pi\u00f9 popolare nel settore dello sviluppo di giochi. Prima di scrivere il gioco, avevo una leggera esperienza nello sviluppo di semplici applicazioni su Rust. Questo era sufficiente per sentire una certa libert\u00e0 durante la scrittura del gioco.<\/p>\n<h3>Perch\u00e9 proprio un gioco e che gioco?<\/h3>\n<p>\nCreare giochi \u00e8 divertente! Vorrei che ci fossero pi\u00f9 motivi, ma per i progetti \u00abdomestici\u00bb scelgo temi che non sono troppo strettamente legati al mio lavoro abituale. Che gioco? Volevo creare qualcosa simile a un simulatore di tennis, dove si combinano Cities Skylines, Zoo Tycoon, Prison Architect e, appunto, il tennis. In sostanza, \u00e8 venuto fuori un gioco su un'accademia di tennis, dove le persone possono giocare.<\/p>\n<h3>Preparazione tecnica<\/h3>\n<p>\nVolevo utilizzare Rust, ma non sapevo esattamente da quanto \u00abzero\u00bb sarebbe stato necessario iniziare a lavorare. Non volevo scrivere shader pixel e utilizzare drag-n-drop, quindi cercavo le soluzioni pi\u00f9 flessibili.<\/p>\n<p>Ho trovato delle risorse utili, che condivider\u00f2 con voi:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 un elenco di elementi necessari per lo sviluppo di giochi in Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Subreddit di sviluppo giochi Rust;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Pixel art gratuita.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nHo esaminato diversi motori di gioco Rust, scegliendo infine Piston e ggez. Li avevo gi\u00e0 incontrati lavorando al mio progetto precedente. Alla fine ho scelto ggez, poich\u00e9 sembrava pi\u00f9 adatto per realizzare un piccolo gioco 2D. La struttura modulare di Piston \u00e8 troppo complessa per uno sviluppatore alle prime armi (o per chi lavora su Rust per la prima volta).<\/p>\n<h3>Struttura del gioco<\/h3>\n<p>\nHo dedicato un po' di tempo a riflettere sull'architettura del progetto. Il primo passo \u00e8 realizzare la \u00abterra\u00bb, le persone e i campi da tennis. Le persone devono muoversi sui campi e aspettare. I giocatori devono avere abilit\u00e0 che si perfezionano col tempo. Inoltre, deve esserci un editor che consenta di aggiungere nuove persone e campi, ma questo non \u00e8 gratuito.<\/p>\n<p>Dopo aver pensato a tutto, ho iniziato a lavorare. <\/p>\n<h3>Creazione di un gioco<\/h3>\n<p>\n<b>Inizio: cerchi e astrazioni<\/b><\/p>\n<p>Ho preso un esempio da ggez e ho ottenuto un cerchio sullo schermo. Straordinario! Ora un po' di astrazioni. Ho pensato che sarebbe utile astrarre l'idea di oggetto di gioco. Ogni oggetto deve essere renderizzato e aggiornato come indicato qui:<\/p>\n<pre><code class=\"rust\">\/\/ the game object trait\ntrait GameObject {\n    fn update(&amp;mut self, _ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt;;\n    fn draw(&amp;mut self, ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt;;\n}\n \n\/\/ a specific game object - Circle\nstruct Circle {\n    position: Point2,\n}\n \n impl Circle {\n    fn new(position: Point2) -&gt; Circle {\n        Circle { position }\n    }\n}\nimpl GameObject for Circle {\n    fn update(&amp;mut self, _ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt; {\n        Ok(())\n    }\n    fn draw(&amp;mut self, ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt; {\n        let circle =\n            graphics::Mesh::new_circle(ctx, graphics::DrawMode::Fill, self.position, 100.0, 2.0)?;\n \n         graphics::draw(ctx, &amp;circle, na::Point2::new(0.0, 0.0), 0.0)?;\n        Ok(())\n    }\n}<\/code><\/pre>\n<p>\nQuesto pezzo di codice mi ha permesso di ottenere un'ottima lista di oggetti che posso aggiornare e rendere in un ciclo altrettanto ottimo.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler per MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Aggiorna tutti gli oggetti\n        for object in self.objects.iter_mut() {\n            object.update(context)?;\n        }\n \n        Ok(())\n    }\n \n    fn draw(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        graphics::clear(context);\n \n        \/\/ Disegna tutti gli oggetti\n        for object in self.objects.iter_mut() {\n            object.draw(context)?;\n        }\n \n        graphics::present(context);\n \n        Ok(())\n    }\n}<\/code><\/pre>\n<p>\nmain.rs \u00e8 necessario perch\u00e9 contiene tutte le righe di codice. Ho dedicato un po' di tempo a separare i file e ottimizzare la struttura delle directory. Ecco come \u00e8 diventato dopo:<br \/>\n<i>resources -&gt; qui ci sono tutte le risorse (immagini)<br \/>\nsrc<br \/>\n \u2014 entit\u00e0<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; ciclo principale<\/i><\/p>\n<p><b>Persone, campi e immagini<\/b><\/p>\n<p>La fase successiva \u00e8 creare l'oggetto di gioco Person e caricare le immagini. Tutto deve essere costruito su base di mattonelle delle dimensioni 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Giocare a Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Campi da tennis<\/b><\/p>\n<p>Dopo aver studiato com'erano fatti i campi da tennis, ho deciso di farli con mattonelle 4*2. Inizialmente si poteva creare un'immagine di tale dimensione oppure comporre insieme 8 mattonelle separate. Ma poi ho capito che servivano solo due mattonelle uniche, ecco perch\u00e9.<\/p>\n<p>In totale abbiamo due mattonelle: 1 e 2.<\/p>\n<p>Ogni sezione del campo consiste di un mattonella 1 o mattonella 2. Possono essere disposte come al solito o essere capovolte di 180 gradi.<\/p>\n<p><img decoding=\"async\" alt=\"Giocare a Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Modalit\u00e0 principale di costruzione (assemblaggio)<\/b><\/p>\n<p>Dopo aver reso visibili i campi, le persone e le mappe, ho capito che era necessaria anche una modalit\u00e0 di assemblaggio di base. L'ho implementata cos\u00ec: quando il pulsante \u00e8 premuto, l'oggetto \u00e8 selezionato e il clic lo posiziona nel luogo desiderato. Cos\u00ec, il pulsante 1 permette di selezionare il campo, mentre il pulsante 2 consente di selezionare un giocatore.<\/p>\n<p>Ma \u00e8 anche necessario ricordare cosa significano 1 e 2, quindi ho aggiunto un wireframe per far capire quale oggetto \u00e8 selezionato. Ecco come appare.<\/p>\n<p><img decoding=\"async\" alt=\"Giocare a Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Domande sull'architettura e il refactoring<\/b><\/p>\n<p>Ora ho diversi oggetti di gioco: persone, campi e piani. Ma affinch\u00e9 i wireframe funzionino, \u00e8 necessario comunicare a ciascuna entit\u00e0 dell'oggetto se gli oggetti stessi sono in modalit\u00e0 dimostrativa o se \u00e8 semplicemente disegnata una cornice. Non \u00e8 molto comodo.<\/p>\n<p>Ho pensato che fosse necessario ripensare l'architettura in modo che emergessero alcune limitazioni:<\/p>\n<ul>\n<li>la presenza di un'entit\u00e0 che si visualizza e si aggiorna da sola \u00e8 un problema, poich\u00e9 quest'entit\u00e0 non sar\u00e0 in grado di 'sapere' cosa deve renderizzare: l'immagine e il wireframe;<\/li>\n<li>la mancanza di uno strumento per lo scambio di propriet\u00e0 e comportamenti tra entit\u00e0 separate (ad esempio, la propriet\u00e0 is_build_mode o il rendering del comportamento). Si potrebbe utilizzare l'ereditariet\u00e0, anche se in Rust non c'\u00e8 un modo normale per realizzarla. Ci\u00f2 di cui avevo davvero bisogno era la composizione;<\/li>\n<li>uno strumento per interagire tra le entit\u00e0 era necessario per assegnare persone ai campi;<\/li>\n<li>le stesse entit\u00e0 rappresentavano una miscela di dati e logica, il che usciva rapidamente fuori controllo.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Ho condotto un'ulteriore ricerca e ho scoperto l'architettura <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, che \u00e8 comunemente usata nei giochi. Ecco i vantaggi dell'ECS:<\/p>\n<ul>\n<li>i dati sono separati dalla logica;<\/li>\n<li>composizione invece di ereditariet\u00e0;<\/li>\n<li>architettura orientata ai dati.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nPer l'ECS ci sono tre concetti di base:<\/p>\n<ul>\n<li>entit\u00e0 \u2014 tipo di oggetto a cui si riferisce un identificatore (questo pu\u00f2 essere un giocatore, una pallina o altro);<\/li>\n<li>componenti \u2014 da cui sono composte le entit\u00e0. Esempio \u2014 componente di rendering, posizione e altri. Questi sono contenitori di dati;<\/li>\n<li>sistemi \u2014 utilizzano sia oggetti che componenti, pi\u00f9 contengono comportamento e logica basati su questi dati. Esempio \u2014 sistema di rendering che esamina tutte le entit\u00e0 con componenti per il rendering e si occupa del disegno.<\/li>\n<\/ul>\n<p>\nDopo lo studio \u00e8 diventato chiaro che l'ECS risolve i seguenti problemi:<\/p>\n<ul>\n<li>applicazione della composizione invece dell'ereditariet\u00e0 per l'organizzazione sistemica delle entit\u00e0; <\/li>\n<li>eliminazione del disordine del codice attraverso sistemi di gestione; <\/li>\n<li>uso di metodi come is_build_mode per mantenere la logica del wireframe nello stesso luogo \u2014 nel sistema di rendering.<\/li>\n<\/ul>\n<p>\nEcco cosa \u00e8 risultato dopo l'implementazione dell'ECS.<\/p>\n<p><i>resources -&gt; qui ci sono tutte le risorse (immagini)<br \/>\nsrc<br \/>\n \u2014 components<br \/>\n \u2014 position.rs<br \/>\n \u2014 person.rs<br \/>\n \u2014 tennis_court.rs<br \/>\n \u2014 floor.rs<br \/>\n \u2014 wireframe.rs<br \/>\n \u2014 mouse_tracked.rs<br \/>\n \u2014 resources<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 systems<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; funzioni della fabbrica mondiale<br \/>\n \u2014 main.rs -&gt; ciclo principale<\/i><\/p>\n<h3>Assegniamo persone ai campi<\/h3>\n<p>\nECS ha semplificato la vita. Adesso avevo un metodo sistematico per aggiungere dati alle entit\u00e0 e integrare logica basata su questi dati. Questo, a sua volta, ha permesso di organizzare la distribuzione delle persone sui campi.<\/p>\n<p>Cosa ho fatto:<\/p>\n<ul>\n<li>ho aggiunto dati sui campi assegnati a Persone;<\/li>\n<li>ho aggiunto dati sulle persone distribuite a TennisCourt;<\/li>\n<li>ho aggiunto CourtChoosingSystem, che consente di analizzare le persone e i campi, scoprire i campi disponibili e distribuire i giocatori su di essi;<\/li>\n<li>ho aggiunto il sistema PersonMovementSystem, che cerca le persone assegnate ai campi e, se non sono l\u00ec, le invia dove necessario.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Giocare a Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Riepiloghiamo<\/h3>\n<p>\nMi \u00e8 piaciuto molto lavorare a questo semplice gioco. Inoltre, sono soddisfatta di aver utilizzato Rust per scriverlo, perch\u00e9:<\/p>\n<ul>\n<li>Rust ti offre ci\u00f2 di cui hai bisogno;<\/li>\n<li>ha una documentazione eccellente, Rust \u00e8 molto elegante;<\/li>\n<li>la costanza \u00e8 fantastica;<\/li>\n<li>non \u00e8 necessario ricorrere a clonazioni, copie o azioni simili, cosa che facevo spesso in C++;<\/li>\n<li>Options \u00e8 molto comodo da usare, gestisce anche bene gli errori;<\/li>\n<li>se il progetto \u00e8 riuscito a compilarsi, allora nel 99% dei casi funziona esattamente come dovrebbe. I messaggi di errore del compilatore sono, a mio avviso, i migliori che abbia mai visto.<\/li>\n<\/ul>\n<p>\nLo sviluppo di giochi in Rust \u00e8 solo agli inizi. Ma c'\u00e8 gi\u00e0 una comunit\u00e0 stabile e piuttosto ampia che lavora per rendere Rust accessibile a tutti. Quindi guardo al futuro del linguaggio con ottimismo, ansiosa di vedere i risultati del nostro lavoro comune.<\/p>\n<blockquote><p><b>Skillbox consiglia:<\/b><\/p>\n<ul>\n<li>Corso online <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/frontend-developer\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=FRENDEV&amp;utm_content=articles&amp;utm_term=rust24\">\u00abProfessione sviluppatore frontend\u00bb<\/a><\/noindex>.<\/li>\n<li>Corso pratico <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/agima\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=AGIMA&amp;utm_content=articles&amp;utm_term=rust24\">\u00abSviluppatore mobile PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Corso pratico annuale <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=rust24\">\u00abSviluppatore PHP da 0 a PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/444364\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 Rust. \u041d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e 24 \u0447\u0430\u0441\u043e\u0432 (\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043f\u043e \u0432\u0435\u0447\u0435\u0440\u0430\u043c \u0438\u043b\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445). \u0418\u0433\u0440\u0430 \u0435\u0449\u0435 \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043f\u044b\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0447\u0435\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u043b\u0430\u0441\u044c, \u0438 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u0445, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0438\u0433\u0440\u044b \u0441 \u043d\u0443\u043b\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-29846","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0433\u0440\u0430 \u043d\u0430 Rust \u0437\u0430 24 \u0447\u0430\u0441\u0430: \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:32:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:32:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Programmare in Rust in 24 ore: esperienza personale di sviluppo | ProHoster","description":"In questo articolo parler\u00f2 della mia esperienza personale.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0433\u0440\u0430 \u043d\u0430 Rust \u0437\u0430 24 \u0447\u0430\u0441\u0430: \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.","og:url":"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:32:19+00:00","article:modified_time":"2019-10-31T18:32:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"29846","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-20 22:43:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:47:36","updated":"2026-01-20 22:43:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}