<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fi">
    <title>Learners First, edistynyttä tietotekniikan koulutusta</title>
    <subtitle>Koulutusta: tietoturvallisuus (CISSP ja ISO27001) ja edistynyt ohjelmointi (Rust ja Go)</subtitle>
    <link rel="self" type="application/atom+xml" href="./atom.xml"/>
    <link rel="alternate" type="text/html" href="."/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-11-07T00:00:00+00:00</updated>
    <id>./atom.xml</id>
    <entry xml:lang="fi">
        <title>crates.io-tunnus vaarassa</title>
        <published>2024-11-07T00:00:00+00:00</published>
        <updated>2024-11-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/crates-io/"/>
        <id>./posts/crates-io/</id>
        
        <content type="html" xml:base="./posts/crates-io/">&lt;h2 id=&quot;io-tunnuksen-katoaminen-ja-crates-io&quot;&gt;.io -tunnuksen katoaminen ja crates.io&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#io-tunnuksen-katoaminen-ja-crates-io&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rustin pakettivarasto &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;crates.io&quot;&gt;crates.io&lt;&#x2F;a&gt; on yksi
Rust-ohjelmointiympäristön
tärkeimmistä osista. Kun käännöksessä tarvitaan puuttuvaa kirjastoa,
se haetaan automaattisesti crates.io:sta.&lt;&#x2F;p&gt;
&lt;p&gt;Nyt koko .io-tunnus on vaarassa kadota.&lt;&#x2F;p&gt;
&lt;p&gt;Kun Brittiläisen kansainyhteisön siirtomaat itsenäistyivät 60-luvulla, yksi näistä
itsenäistyvistä siirtomaista oli Mauritius. Mauritiuksen Chagossaaret
(pääsaari on Diego Garcian atolli) jäi kuitenkin Britannian hallintaan.
Erotettua osaa kutsuttiin nimellä BIOT, British Indian Ocean Territory.&lt;&#x2F;p&gt;
&lt;p&gt;Diego Garcian atollilla on suuri USA:n sotilastukikohta, jota varten Britannia on
vuokrannut maan USA:lle. Diego Garcian alkuperäiset asukkaat karkotettiin joko
Mauritiukselle tai Britanniaan.&lt;&#x2F;p&gt;
&lt;p&gt;Internet-aikaan tultaessa BIOT sai .io-tunnuksen (Indian Ocean).
Tämä tunnus on ollut suosittu teknologiayritysten keskuudessa, koska se
muistuttaa termiä Input&#x2F;Ouput.&lt;&#x2F;p&gt;
&lt;p&gt;Ongelma vain on se, että Diego Garcian kuuluminen Britannialle oli kansainvälisten
sopimusten vastainen. YK on kartoissaan jo vuosia liittänyt Diego Garcian
Mauritiukseen. Ennen siirtomaiden itsenäistymistä tehtiin sopimus,
etteivät entiset isäntämaat saa poimia rusinoita pullasta vaan siirtomaiden
on itsenäistyttyvä yhtenäisenä. Koska Diego Garcia kuului ennen itsenäistymistä
Mauritiukseen, se olisi pitänyt luovuttaa Mauritiukselle itsenäistymisessä.&lt;&#x2F;p&gt;
&lt;p&gt;Vuosikymmenten taistelun jälkeen on päästy sopimukseen saarten kohtalosta.
Britannia on luvannut luovuttaa Diego Garcian Mauritiukselle. USA:n
tukikohta vuokrataan edelleen pitkäksi aikaa, mutta nyt Mauritiukselta.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä muuttaa Diego Garcian osaksi Mauritiusta, jolloin se ei enää täytä
itsenäisen alueen tunnusmerkkejä. ISO tullee poistamaan maatunnuksen
&quot;io&quot; kaksikirjaimisten maatunnusten listalta ISO 3166-1 melko pian.&lt;&#x2F;p&gt;
&lt;p&gt;Internetin tunnuksista päättävät ovat olleet hyvin tarkkoja siitä, että
&lt;em&gt;kaksikirjaimisen&lt;&#x2F;em&gt; tunnuksen omistaja on itsenäinen valtio. Harvoja poikkeuksia
lukuunottamatta kaksikirjaimiset tunnukset tulevat suoraan ISO:n standardista.
Poikkeus on esimerkiksi .su, joka on jäänyt Venäjän hallintaan, vaikka
Neuvostoliitto hajosi.&lt;&#x2F;p&gt;
&lt;p&gt;.io-tunnusta hallinnoi Internet Computer Bureau Ltd, jonka omistaa
Identity Digital -niminen yritys, jonka puolestaan omistaa Ethos Capital
-niminen amerikkalainen sijoitusrahasto. Vuonna 2020 Ethos yritti ostaa myös
.org-tunnuksen, mistä se sai huonon maineen Internet-hallinnoijien keskuudessa.
Joidenkin mielestä sijoitusrahaston valta .io-tunnukseen on
ongelmallista, varsinkin kun yleensä voi olettaa, että kaksikirjaimisen tunnuksen
hallinnoija on kyseisen maan virasto.&lt;&#x2F;p&gt;
&lt;p&gt;On kuitenkin mahdollista, että Mauritius tekee Chagossaarista oman alueensa.
Suomessa Ahvenanmaalla on oma .ax-tunnuksensa, vaikka se on osa Suomea.&lt;&#x2F;p&gt;
&lt;p&gt;Tällä hetkellä ei ole mitään syytä olettaa, että .io-tunnus olisi kovin
pitkäikäinen. Vielä ei ole paniikkiakaan, koska se ei varmaankaan katoa
seuraavaan viiteen vuoteen, mutta
sen jälkeen tilanne on epävarma. Ennen lopullista katoamista tulee olemaan
vaihe, jossa ei voi luoda enää uusia io-tunnuksia.&lt;&#x2F;p&gt;
&lt;p&gt;On huono ajatus kovakoodata Rust-kääntäjään crates.io-osoitteita.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mita-pitaisi-tehda&quot;&gt;Mitä pitäisi tehdä?&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#mita-pitaisi-tehda&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Luottaminen yhteen ainoaan pakettivarastoon on aina riski.&lt;&#x2F;p&gt;
&lt;p&gt;Toisaalta, kun kirjastoja etsitään, niillä on oltava yksikäsitteinen tunnus.
Kun tunnus on osoite luotettavaan crates.io-palveluun, ei tarvitse miettiä,
mistä kirjasto löytyy tai mikä on sen kryptografisesti turvallinen tarkistussumma.&lt;&#x2F;p&gt;
&lt;p&gt;Ei liene kovin vaikeaa määritellä vaihtoehtoista pakettivaraston osoitetta.
Esimerkiksi crates.org on varattu, mutta se on myynnissä tuhannen dollarin hintaan.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>CISSP on kymmenenneksi rahakkain IT-sertifikaatti USA:ssa</title>
        <published>2024-07-19T00:00:00+00:00</published>
        <updated>2024-07-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/cissp-palkat/"/>
        <id>./posts/cissp-palkat/</id>
        
        <content type="html" xml:base="./posts/cissp-palkat/">&lt;p&gt;PC Magazine vertaili vuoden 2023 lopussa suosituimpia IT-alan
sertifikaatteja. Kouluttamamme CISSP sijoittuu sijalle kymmenen.&lt;&#x2F;p&gt;
&lt;p&gt;Aikaisemmassa artikkelissamme vuodelta 2021 CISSP oli sijalla kuusi.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;uk.pcmag.com&#x2F;news-analysis&#x2F;125662&#x2F;the-10-highest-paying-it-certifications&quot;&gt;The Highest-Paying IT Certifications for 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;CISSP-sertifikaatti tuo tilipussiin Amerikassa keskimäärin
156.699 dollaria vuodessa. Laskua edelliseen vuoteen on prosentti,
mutta kyseessä on kuitenkin erittäin hyvä palkka.&lt;&#x2F;p&gt;
&lt;p&gt;Pilvipalveluiden tietoturvasertifikaatti
AWS Certified Security - Specialty
on sijalla 6.
Palkka nousee CISSP:stä noin kymmenllä tuhannella dollarilla kuussa.&lt;&#x2F;p&gt;
&lt;p&gt;Sijalla 5 on CISM, Certified Information Security Manager.
Palkka on sama kuin AWS-tietorvasertifikaatilla. Palkka on
parempi kuin CISSP:llä, mutta toimenkuvakin muuttuu asiantuntijasta
manageriksi.&lt;&#x2F;p&gt;
&lt;p&gt;Kärkisijat vievät tekniset pilvipalvelujen sertifikaatit. Google Cloud
Architect on johdossa yli 200.000 dollarin vuosipalkalla.&lt;&#x2F;p&gt;
&lt;p&gt;CISSP:n taakse jäävät CRIS eli Certified in Risk and Information
Systems Control, CIPM eli Certified Information Privacy manager
ja CISA eli Certified Information Systems Auditor.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Rust ei ole oliokeskeinen ohjelmointikieli</title>
        <published>2024-07-17T00:00:00+00:00</published>
        <updated>2024-07-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/ei-oo/"/>
        <id>./posts/ei-oo/</id>
        
        <content type="html" xml:base="./posts/ei-oo/">&lt;p&gt;Rust-yhteisössä on yleistä, että aloittelevat Rust-kehittäjät etsivät tapoja soveltaa tuttuja olio-ohjelmoinnin (OOP) konsepteja Rustin maailmaan. Vaikka Rust ei ole puhdas oliokieli, se tarjoaa tehokkaita työkaluja vastaavien ratkaisujen toteuttamiseen.&lt;&#x2F;p&gt;
&lt;p&gt;Tässä käydään läpi niitä olio-ohjelmoinnin
ominaisuuksia, joita on turha etsiä Rustista.&lt;&#x2F;p&gt;
&lt;p&gt;Huomaa, että tässä keskitytään ominaisuuksiin, joita
Rustissa ei ole. Rustissa on paljon ominaisuuksia, jotka
tarjoavat samankaltaisia toiminnallisuuksia kuin oliokielissä, mutta niitä ei tarkemmin käsitellä tässä.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rust-on-muistikeskeinen-ei-toimintakeskeinen-kieli&quot;&gt;Rust on muistikeskeinen, ei toimintakeskeinen kieli&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-on-muistikeskeinen-ei-toimintakeskeinen-kieli&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rustin &quot;objekti&quot; on &lt;code&gt;struct&lt;&#x2F;code&gt;, eli tietue. Se on yksinkertaisesti muistialue, joka sisältää erilaisia
kenttiä objektin kuvaamiseksi.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Objektiin voidaan lisätä funktioita&#x2F;metodeja tai funktioryhmiä, traits.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hei, olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ja olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vuotta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nimi&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rustin erityispiirre on, että sekä structin määrittelijä että käyttäjä voivat lisätä siihen
funktioita (ja traitteja).
Jos esimerkiksi moduuli tarjoaa structin ilman debug-tulostusta (trait &lt;code&gt;Debug&lt;&#x2F;code&gt;), moduulin käyttäjä voi itse lisätä sen.&lt;&#x2F;p&gt;
&lt;p&gt;Funktioiden yhdistäminen structiin ei ole pakollista. Voit aivan hyvin luoda erillisiä funktioita, jotka ottavat structin parametrina.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Henkilo&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hei, olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ja olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vuotta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nimi&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;perinta&quot;&gt;Perintä&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#perinta&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Olio-ohjelmoinnin ja Rustin väliset erot alkavat näkyä perinnässä.&lt;&#x2F;p&gt;
&lt;p&gt;Olio-ohjelmoinnissa olion julkiset ominaisuudet pyritään usein toteuttamaan funktioina.
Tämä mahdollistaa sen, että aliluokat voivat korvata perityt funktiot omalla toteutuksellaan.
Jos esimerkiksi käytät suoraan muuttujaa kuten &lt;code&gt;ika&lt;&#x2F;code&gt; (u8),
et voi muokata sen toimintaa aliluokassa.
Käyttäjän on tiedettävä,
että kyseessä on etumerkitön 8-bittinen kokonaisluku.&lt;&#x2F;p&gt;
&lt;p&gt;Suora muuttujan käyttö on kuitenkin huomattavasti tehokkaampaa kuin funktiokutsujen ketjun selvittäminen ajon aikana.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi Henkilö-oliosta voisi olio-ohjelmoinnissa tehdä aliluokan,
joka tietosuojasyistä kertoo iän vain asteikolla &quot;alaikäinen&quot;&#x2F;&quot;täysi-ikäinen&quot;.
Jos käyttäjä lukee suoraan &lt;code&gt;ika&lt;&#x2F;code&gt;-muuttujan, tätä ei voi helposti toteuttaa.
Metodin &lt;code&gt;get_ika()&lt;&#x2F;code&gt; avulla aliluokka voi kuitenkin muokata palautettavaa arvoa.
Käyttäjän ei tarvitse tietää, että taustalla on 8-bittinen kokonaisluku, jota muokataan aliluokassa.&lt;&#x2F;p&gt;
&lt;p&gt;Olio-ohjelmointiin liittyy siis usein ylimääräistä työtä, joka ei ole välttämätöntä.
Rust on tietoisesti jättänyt perinnän pois.
Voit huoletta käyttää ika-kenttää suoraan.
Jos haluat piilottaa tietoja, voit käyttää sisäkkäisiä struct-rakenteita,
joissa piilotettava struct on julkisen structin sisällä.
Rustin tyyppijärjestelmä tarjoaa tehokkaampia keinoja tietojen virheellisen käytön estämiseen,
mutta niitä ei käsitellä tässä artikkelissa.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustissa-ei-tarvita-gettereita-ja-settereita&quot;&gt;Rustissa ei tarvita gettereitä ja settereitä&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rustissa-ei-tarvita-gettereita-ja-settereita&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rustissa ei käytetä gettereitä ja settereitä. Näitä käytetään oliokielissä muuttamaan kentän arvo
toiminnoiksi, joita voidaan perinnässä muokata.&lt;&#x2F;p&gt;
&lt;p&gt;Jos haluat muuttaa olion tilaa Rustissa, tee se suoraan.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Matti&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 43&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Seuraava oliokielissä tuikitavallien koodi siis osoittaa, ettet ole ymmärtänyt Rustin oliomallin perusteita.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; set_ika&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; ika&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hei, nimeni on &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ja olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vuotta vanha.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nimi&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Matti&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;set_ika&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;43&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ilman perintää gettereissä ja settereissä ei ole järkeä.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;private-kentat&quot;&gt;Private-kentät&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#private-kentat&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Joissain olio-ohjelmointikielissä kenttien näkyvyyden määrittely on keskeinen osa suunnittelua.
Kentät voivat olla yksityisiä, julkisia, aliluokkien käytettävissä tai oletusarvoisia,
ja esimerkiksi Javassa on peräti 40 eri vaihtoehtoa käyttöpaikkojen ja suojausmääritelmien
yhdistelmille.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa ei ole yksityisiä kenttiä. Kaikki kentät ovat moduulin sisällä julkisia.
Tarkemmasta suojauksesta vastaa Rustin tyyppijärjestelmä.&lt;&#x2F;p&gt;
&lt;p&gt;Moduulien välillä Rustin funktiot ja kentät ovat oletuksena yksityisiä,
mutta ne voidaan julkaista &lt;code&gt;pub&lt;&#x2F;code&gt;-avainsanalla.&lt;&#x2F;p&gt;
&lt;p&gt;Yleisesti ottaen Rustin kanssa voit unohtaa monimutkaiset näkyvyyssäännöt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustissa-ei-ole-new-funktiota-joka-loisi-dynaamisia-objekteja&quot;&gt;Rustissa ei ole new()-funktiota, joka loisi dynaamisia objekteja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rustissa-ei-ole-new-funktiota-joka-loisi-dynaamisia-objekteja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Oliokielissä on usein konstruktoreita ja destruktoreita.
Konstruktori luo olion ja destruktori poistaa sen. Rustista niitä on turha etsiä.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa ei ole erityistä new-konstruktoria, joka loisi olion. Ja erityisesti Rustissa ei ole new-konstruktoria,
joka loisi dynaamisen olion.&lt;&#x2F;p&gt;
&lt;p&gt;Rust-olioita voi luoda aivan hyvin pinomuuttujina.
Useimmat Rust-oliot eivät ole dynaamisia olioita, joille
tila on varattava ajon aikana keosta.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Matti&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä olio käyttäytyy aivan kuin normaali muuttuja. Se on pinossa ja se poistetaan automaattisesti,
kun sen käyttöalue päättyy. Sen koko tiedetään käännösaikana, joten se vain varataan pinosta
ilman mitään muuta työtä.&lt;&#x2F;p&gt;
&lt;p&gt;Huomaa, että nimi on tyyppiä String, joka aina automaattisesti varataan keosta. Pinossa on siis
vain viite kekoon tuon kentän osalta.&lt;&#x2F;p&gt;
&lt;p&gt;Jos olio luodaan dynaamisesti, se tehdään Boxin avulla.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Box&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Matti&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dynaamiset muuttujat ovat aina sidoksissa pinomuuttujaan. Kun pinomuuttuja poistuu pinosta,
siihen liittyvä dynaaminen muuttuja poistetaan automaattisesti.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Box käyttää standardikirjaston allokaattoria
std::alloc::System,
joka on oletuksena Linuxissa glibc:n malloc().
Sen voi kuitenkin korvata omalla allokaattorilla.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Rustissa on usein tapana tehdä new-funktio, joka luo olion. Mutta tämäkään ei ole dynaaminen olio.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;nimi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; ika&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        Henkilo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; nimi&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; ika&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hei, nimeni on &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ja olen &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vuotta vanha.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nimi&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;ika&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Matti&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    henkilo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tervehdi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä esimerkki luo Henkilo-tyyppisen olion new()-funktiossa ja palauttaa sen main()-funktiolle.
Paluuarvo &lt;strong&gt;kopioidaan&lt;&#x2F;strong&gt; main()-funktion henkilo-muuttujaan. Sille siis tehdään tilaa main()-funktion
pinosta jo main()-funktion käynnistyessä.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa &lt;strong&gt;new()-funktio ei ole merkki dynaamisesta muistinvarauksesta&lt;&#x2F;strong&gt;.
Sen käyttö on täysin vapaaehtoista. Kyse on tavallisesta käytännöstä, ei kielessä olevasta rakenteesta.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustissa-ei-puhuta-patterneista&quot;&gt;Rustissa ei puhuta &lt;strong&gt;patterneista&lt;&#x2F;strong&gt;&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rustissa-ei-puhuta-patterneista&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Patternit ovat oliokielten tapa selvitä ongelmista, joita oliomalli aiheuttaa.&lt;&#x2F;p&gt;
&lt;p&gt;Periaatteessa Rustissakin voisi olla patterneja, mutta kieli taipuu paljon paremmin selvittämään nuo ongelmat
toisilla tavoilla.&lt;&#x2F;p&gt;
&lt;p&gt;Siksi: &quot;First rule of Rust: Don&#x27;t talk about patterns.&quot;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Rust tulossa Windowsiin</title>
        <published>2023-05-09T00:00:00+00:00</published>
        <updated>2023-05-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/windows-rust/"/>
        <id>./posts/windows-rust/</id>
        
        <content type="html" xml:base="./posts/windows-rust/">&lt;h2 id=&quot;rust-tulossa-windowsiin&quot;&gt;Rust tulossa Windowsiin&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-tulossa-windowsiin&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rust on loistava uusi kieli rautaa lähellä olevaan ohjelmointiin. Rustilla tehdyt ohjelmat ovat tehokkaita, virheettömiä ja ohjelmoinnissa voi käyttää korkeita abstraktioita. Eipä siis ole ihme, että myös Microsoft on alkanut käyttää sitä Windowsin ytimen kehityksessä.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;Rusty_windows.jpg&quot; alt=&quot;Rusty Windows logo&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Käyttöjärjestelmän tietoturvallisuuden johtaja David Weston vahvisti konferenssissa huhtikuussa 2023, että Windows 11:ssa tulee olemaan Rustilla kirjoitettua koodia viikkojen tai korkeintaan kuukausien päästä. Windows 11 preview -versiossa joitakin käyttöjärjestelmän osia on kirjoitettu uudelleen Rustilla.&lt;&#x2F;p&gt;
&lt;p&gt;Rust-koodin nopeus on ollut erinomainen, mitään huononnusta C++ -versioon Microsoft ei ole havainnut.&lt;&#x2F;p&gt;
&lt;p&gt;Microsoft kiittää Rustissa muistiturvallisuuden lisäksi mm. Result- ja Vec-tyyppejä, jotka tekevät APIeista helpompia ymmärtää. Rustin odotetaan tekevän Windowssista turvallisemman ja helpomman ylläpitää.&lt;&#x2F;p&gt;
&lt;p&gt;Jo syyskuussa 2022 Microsoft Azuren johtaja Mark Russinovich kertoi, että Microsoft on alkanut käyttää Rustia Azure-palvelimien kehityksessä. Kaikkien uusien projektien odotetaan käyttävän Rustia C&#x2F;C++:n sijaan.&lt;&#x2F;p&gt;
&lt;p&gt;Ensimmäinen Microsoftin isompi Rust-projekti on ollut DWriteCore, joka on DirectWrite-kirjaston uusi versio. DirectWrite on Windowsin kirjasto, joka piirtää tekstin näytölle. Tällä hetkellä kirjastossa on 152 000 riviä koodia, josta 56 000 on Rustia. Tämänhetkinen kirjasto on 5 - 15% nopeampi kuin C++-versio. Kirjasto on jo nyt kehittäjien käytössä.&lt;&#x2F;p&gt;
&lt;p&gt;Toinen työn alla oleva kirjasto on Win32 GDI, joka on Windowsin graafinen kirjasto. Tästä 36 000 riviä koodia on kirjoitettu uudelleen Rustilla, mutta se ei ole vielä kehittäjien käytettävissä.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.windowslatest.com&#x2F;2023&#x2F;05&#x2F;02&#x2F;windows-11-updates-booting-with-rust-refs-instead-of-ntfs-file-system&quot;&gt;https:&#x2F;&#x2F;www.windowslatest.com&#x2F;2023&#x2F;05&#x2F;02&#x2F;windows-11-updates-booting-with-rust-refs-instead-of-ntfs-file-system&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.theregister.com&#x2F;2023&#x2F;04&#x2F;27&#x2F;microsoft_windows_rust&quot;&gt;https:&#x2F;&#x2F;www.theregister.com&#x2F;2023&#x2F;04&#x2F;27&#x2F;microsoft_windows_rust&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Heterogeeninen lista Rustissa</title>
        <published>2022-07-02T00:00:00+00:00</published>
        <updated>2022-07-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/heterogeeninen-lista/"/>
        <id>./posts/heterogeeninen-lista/</id>
        
        <content type="html" xml:base="./posts/heterogeeninen-lista/">&lt;h2 id=&quot;heterogeeninen-lista&quot;&gt;Heterogeeninen lista&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#heterogeeninen-lista&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rust-ohjelmointikielessä ei ole olio-ohjelmoinnin
perintää. Kuitenkin hyödyllisimmät perinnän edut
saadaan aikaan traiteilla. Tärkein käyttötarkoitus
on heterogeeninen lista. Heterogeenisessa listassa on
useita erityyppisiä olioita, joilla kaikilla on sama
trait eli joukko samalla tavalla kutsuttavia
funktioita.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;drawable-ja-executable-esimerkki&quot;&gt;Drawable ja executable -esimerkki&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#drawable-ja-executable-esimerkki&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Peleissä käytetään paljon heterogeenisia listoja.
Esimerkiksi virtuaalimaailman objektit käydään
nopeasti läpi kutsumalla piirrettävissä olevien
objektien draw()-funktiota ja esim. kerran
mikrosekunnissa muutosta vaativien objektien tick()-funktiota. Itse objektit voivat muuten olla
täysin erilaisia.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä on perinteinen esimerkki heterogeenisista
listoista, joita nyt tässäkin käytämme.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;olio-ohjelmoinnin-ratkaisu&quot;&gt;Olio-ohjelmoinnin ratkaisu&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#olio-ohjelmoinnin-ratkaisu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Olio-ohjelmoinnissa piirrettävissä olevat oliot
ovat erikoistapauksia (&quot;perivät&quot;) samasta
drawable-luokasta. Silloin näitä olioita voi laittaa
samaan taulukkoon, joka nopeasti käydään läpi kutsuen
kaikille yhteistä draw()-funtiota.&lt;&#x2F;p&gt;
&lt;p&gt;Puuttumatta yksityiskohtiin, oliokielten perinnässä
on aina jonkin verran ajonaikaista tehottomuutta. Myös jos sama objekti on sekä &quot;drawable&quot; että &quot;executable&quot;,
niiden on perittävä kummastakin luokasta. Tästä
tulee omat sotkunsa, jotka eri oliokielet ratkaisevat
eri tavalla.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rust-trait&quot;&gt;Rust-trait&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-trait&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rust ratkaisee ongelman traiteilla. Jos olioon on
liitetty trait &quot;Drawable&quot;, sen on toteutettava
funktio Draw() identtisellä tavalla. Tämä ei kuitenkaan
anna vielä lupaa kutsua tätä funktiota tietämättä
olion tyyppiä käännösaikana.&lt;&#x2F;p&gt;
&lt;p&gt;Rust on staattinen kieli, jossa ei lisätä dynaamisia
tietorakenteita turhan takia.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi tyyppi &quot;Line&quot; voi olla&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;trait&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä tarkoittaa, että jos tästä tyypistä luodaan
muutuja, se on täsmälleen 4*32 bittiä eli 16 tavua.
muuttujassa ei ole tietoa tyypistä tai ohjeita
Draw()-funktion kutsumiseen.&lt;&#x2F;p&gt;
&lt;p&gt;Voit luoda Line-tyyppisen muuttujan ja kutsua sen
Draw()-funktiota, esim.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;mutta tämä perustuu siihen, että kääntäjä tietää
käännösaikana muuttujan line tyypin ja osaa siten
kutsua oikeaa Draw()-funktiota.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dynaaminen-trait-objekti&quot;&gt;Dynaaminen trait-objekti&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#dynaaminen-trait-objekti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Että voimme käsitellä samassa listassa eri tyyppisiä
instansseja, joudumme luomaan trait-objekti -tyyppisen
viittauksen varsinaiseen objektiin.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Oikeaan muistissa olevaan objektiin line voi luoda
viittauksen trait-objektina. Tähän viittaukseen
lisätään tyyppi-informaatio niin, että viittausta
voi käyttää myös sellaisissa tilanteissa, että
tyyppi ei ole selvillä käännösaikana.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkissä muuttujan l tyyppi ei ole Line vaan
&quot;mikä tahansa, mikä toteuttaa traitin Drawable&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Toteutus tässä on se, että muuttuja l on
todellisuudessa kaksi osoitinta. Yksi, joka osoittaa muuttuujaan line ja siellä oleviin kuuteentoista tavuun dataan. Ja toinen, joka osoittaa staattisella
alueella sijaitsevaan &quot;vtableen&quot; (virtual table).
Vtable luodaan jokaiselle tyypille jokaiselle
traitille, ja se siältää osoittimet tuon tyypin funktioille.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkissämme stattisella muistialueella on
siis osoitin fuktioon Draw() tyypille Line.
Kaikissa traitin Drawable vtableissa on samassa
paikassa osoitin funktioon Draw(), eri tyypeillä
on vain eri vtable.&lt;&#x2F;p&gt;
&lt;p&gt;Kun siis kutsutaan seuraavaa Draw()-funtiota&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; x tyyppiä &amp;amp;dyn Drawable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ensin otetaan muuttujasta x se osa, joka osoittaa
vtableen. vtablen vakiokohdasta, esim. tavu 16
löytyy osoite funktioon Draw Line-tyypin traitista
Drawable. Tälle annetaan parametreiksi muuttujan
x toisen osan pointterin päästä löytyvä muuttuja.&lt;&#x2F;p&gt;
&lt;p&gt;Kaikki tapahtuu erittäin tehokkaasti kun kaikki
raskas päättely tehdään jo käännösaikana.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kuinka-tehda-heterogeeninen-lista&quot;&gt;Kuinka tehdä heterogeeninen lista&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#kuinka-tehda-heterogeeninen-lista&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Nyt maillä on ainekset koossa heterogeeniseen
listaan.&lt;&#x2F;p&gt;
&lt;p&gt;Yksinkertaisesti teemme listan, jossa on viittauksia
objekteihin, joiden tyyppi toteuttaa Drawable-traitin.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;square&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Objektilla on siis oltava todellinen muistia
varaava implementaatio valmiina muualla.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;esimerkkikoodi&quot;&gt;Esimerkkikoodi&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#esimerkkikoodi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Ja tässä vielä kokonaisuudessaan esimerkkikoodi
heterogeenisten listojen käytöstä.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;allow&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;dead_code&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Square&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    width&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    height&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;trait&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Square&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;square&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;trait&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Executable&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tick&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Executable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Square&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tick&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;square tick&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Line&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt; x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; square&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Square&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; width&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; height&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Drawable&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;square&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Executable&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;square&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;square&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;square&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;iter &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;draw&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;iter &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tick&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Rust itseopiskelumateriaaleja</title>
        <published>2022-01-06T00:00:00+00:00</published>
        <updated>2022-01-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/rust-itseopiskelu/"/>
        <id>./posts/rust-itseopiskelu/</id>
        
        <content type="html" xml:base="./posts/rust-itseopiskelu/">&lt;h2 id=&quot;rust-ohjelmointikielen-kokeiluymparistoja&quot;&gt;Rust-ohjelmointikielen kokeiluympäristöjä&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-ohjelmointikielen-kokeiluymparistoja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rust-ohjelmointia voi harjoitella itsekseen monella tavalla.
Tässä listataan joitakin vaihtoehtoja, jotka eivät ole
pelkkää lukemista, vaan niiden avulla voi oppia kirjoittamalla
koodia.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tour-of-rust&quot;&gt;Tour of Rust&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#tour-of-rust&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Tour of rust käy läpi Rustin perusteet yhdeksässä kappaleessa.
Jokaiseen asiaan liittyy esimerkki, joka on kuvauksen
vieressä. Esimerkkiä voi muuttaa ja ajaa suoraan ikkunassa.&lt;&#x2F;p&gt;
&lt;p&gt;Kurssin ensimmäinen kappale on käännetty suomeksikin
allekirjoittaneen toimesta, mutta se kannattaa käydä
läpi alkuperäisenä englanninkielisenä versiona.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tourofrust.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;tourofrust.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;rust-playground&quot;&gt;Rust Playground&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-playground&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Tour of Rustin esimerkit itse asiassa suoritetaan
upotetussa Rust Playground -ikkunassa. Tätä voi käyttää suoraan
selaimesta osoitteessa&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;play.rust-lang.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;play.rust-lang.org&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pro-vihje: voit tutkia ohjelman tuottamaan Assembly-koodia
vaihtamalla Play -&amp;gt; Asm ja Debug -&amp;gt; Release. Ohjelmassa
on vieläkin aika paljon ylimääräistä, mutta pääohjelmasi
tuottama Assembly-koodi löytyy kohdasta playground::main.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;vs-code-rust-playground&quot;&gt;VS Code Rust Playground&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#vs-code-rust-playground&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Joskus nopeisiin kokeiluihin ei riitä Rust Playgroundin
sallimat cratet tai CPU-aika, joten voit haluta vastaavan
toiminnallisuuden omaan koneeseesi.&lt;&#x2F;p&gt;
&lt;p&gt;VS Codeen on saatavilla plugin, jolla Rust-koodia voidaan
kokeilla nopeasti luomatta kokonaista projektia:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;marketplace.visualstudio.com&#x2F;items?itemName=ConradLudgate.rust-playground&quot;&gt;https:&#x2F;&#x2F;marketplace.visualstudio.com&#x2F;items?itemName=ConradLudgate.rust-playground&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;intellij-idea-rust-playground&quot;&gt;IntelliJ IDEA Rust Playground&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#intellij-idea-rust-playground&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Vastaava Rust Playground IntelliJ IDEA -kehitysympäristöön löytyy&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MolotovCherry&#x2F;IntelliJ-Rust-Playground&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;MolotovCherry&#x2F;IntelliJ-Rust-Playground&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;rust-tehtavia-editorilla-ja-tarkistimella&quot;&gt;Rust-tehtäviä editorilla ja tarkistimella&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-tehtavia-editorilla-ja-tarkistimella&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;codewars-rust&quot;&gt;CodeWars Rust&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#codewars-rust&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;CodeWars sisältää tehtäviä, jotka voi tehdä sisäänrakennetulla
editorilla, testata vastauksensa ja sitten toimittaa vastauksen
julkiseen arvosteluun.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.codewars.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.codewars.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Rust-tehtäviä on tällä hetkellä noin 550 ja ne on jaettu
kahdeksaan vaikeusasteeseen. Tehtävät ovat käyttäjien
tekemiä.&lt;&#x2F;p&gt;
&lt;p&gt;Yksi hankaluus näissä tehtävissä on, että samat tehtävät
on tarkoitettu usealle eri ohjelmointikielelle. Esimerkiksi
keskimmäisen kirjaimen löytäminen merkkijonosta on Rustilla
paljon vaikeampaa kuin C:llä, koska C olettaa tasamittaisen
ASCII-koodin mutta Rust UTF-8 vaihtuvakoodisen merkistön.
Monien tehtävien hyväksytyt ratkaisut ovatkin rumaa Rust-kieltä.&lt;&#x2F;p&gt;
&lt;p&gt;Monet tehtävät ovat myöskin enemmän matematiikkaa kuin
ohjelmointia.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;leetcode&quot;&gt;LeetCode&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#leetcode&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Toinen samanlainen sivusto on LeetCode.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;leetcode.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;leetcode.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Näistä monen tehtävän ongelmana on, että ne vaativat suoraan
linkitetyn listan käyttöä, mikä on Rustissa vaikeaa tai
mahdotontakin (ilman unsafe-lohkoja).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;codingame&quot;&gt;Codingame&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#codingame&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Rustia voi oppia myös pelaamalla. Tällä sivustolla
voit haastaa vastustajia 15 minuutin otteluun
tehtävien ratkaisuista.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.codingame.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.codingame.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Nopeimmat ratkaisevat tehtävät yleensä Pythonilla, joten
joudut olemaan nopeampi kuin he.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;muut&quot;&gt;Muut&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#muut&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Tässä vielä muutama samantyyppinen tehtäväsivusto, joka tukee
Rustia. Näitä en ole kokeillut.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;exercism.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;exercism.org&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.codechef.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.codechef.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.spoj.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.spoj.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Excercism tarjoaa perusharjoituksia 55 ohjelmointikielelle, joista
Go on neljänneksi suosituin ja Rust viidenneksi.&lt;&#x2F;p&gt;
&lt;p&gt;Excercismin harjoitukset on ryhmitetty kielten rakenteiden
mukaan, ja ne ovat CodeWarsiin ja LeetCodeen verrattuna yksinkertaisia.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Päivitys 2024: IntellijIDEA-linkki vaihdettu toimivaksi.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Minimaalinen Docker&#x2F;Rust image</title>
        <published>2021-11-23T00:00:00+00:00</published>
        <updated>2021-11-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/minimaalinen-rust-docker/"/>
        <id>./posts/minimaalinen-rust-docker/</id>
        
        <content type="html" xml:base="./posts/minimaalinen-rust-docker/">&lt;h2 id=&quot;kuinka-tehda-minimaalinen-docker-kontti-jossa-on-vain-rust-ohjelma&quot;&gt;Kuinka tehdä minimaalinen Docker-kontti, jossa on vain Rust-ohjelma&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#kuinka-tehda-minimaalinen-docker-kontti-jossa-on-vain-rust-ohjelma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Minimaalisessa Docker-kontissa ei ole muuta kuin
yksi staattisesti linkitetty ohjelma.&lt;&#x2F;p&gt;
&lt;p&gt;Staattisessa ohjelmassa on kaikki mahdolliset kirjastot
otettu mukaan samaan suoritettavaan tiedostoon.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;scratch-image&quot;&gt;Scratch-image&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#scratch-image&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Kun käytämme pohjana Docker-konttia &lt;code&gt;Scratch&lt;&#x2F;code&gt;, imagen
koko muu tiedostojärjestelmä on tyhjä.&lt;&#x2F;p&gt;
&lt;p&gt;Itse asiassa Docker toteuttaa tämän imagen sisäisesti.
Vanhemmissa Dockereissa &lt;code&gt;FROM Scratch&lt;&#x2F;code&gt; loi oikeasti
tyhjän tiedostolayerin, mutta uusimmissa ei luoda
erillistä tiedostolayeriä. [5]&lt;&#x2F;p&gt;
&lt;p&gt;Rust-ohjelmamme tulee olemaan tiedostojärjestelmän ainoa
tiedosto.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;esimerkkiohjelma&quot;&gt;Esimerkkiohjelma&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#esimerkkiohjelma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Esimerkkiohjelma käy pyytämässä httpbin.org -palvelusta
kysyjän eli meidän ulkoisen IP-osoitteemme
merkkijonona, esim. &quot;122.123.124.125&quot;. [1]&lt;&#x2F;p&gt;
&lt;p&gt;Haussa käytetään webbikutsun tekevää &lt;code&gt;reqwest&lt;&#x2F;code&gt;-pakettia
ja &lt;code&gt;JSON&lt;&#x2F;code&gt;-vastauksen aukaisevaa &lt;code&gt;Serde&lt;&#x2F;code&gt;-pakettia.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; serde&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Deserialize&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; std&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Deserialize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ApiRes&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Box&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; res&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; reqwest&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;blocking&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;http:&#x2F;&#x2F;httpbin.org&#x2F;ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ApiRes&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; res&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;origin&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    Ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;cargo-toml&quot;&gt;Cargo.toml&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#cargo-toml&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Projektin kuvauksessa joudutaan asettamaan muutama
valinnainen ominaisuus.&lt;&#x2F;p&gt;
&lt;p&gt;Serden ominaisuus &quot;derive&quot; on valinnainen. Sen ja
reqwest-craten &quot;json&quot;-ominasuuden avulla web-kutsun
paluu-JSON luetaan suoraan kentän &quot;origin&quot; arvoksi.&lt;&#x2F;p&gt;
&lt;p&gt;Web-kutsun tekevän reqwest-paketin oletus on
asynkroninen toiminta. Yksinkertaisesti vastausta
odottamaan jäävää blocking-ominaisuutta täytyy
erikseen pyytää.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;package&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;minimal-docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0.1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;edition&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;2018&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;serde&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; version&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1.0.130&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; features&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;reqwest&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; version&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0.11.6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; default-features&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; features&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;blocking&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;kaannos&quot;&gt;Käännös&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#kaannos&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Staattisessa käännöksessä kaikki kirjastot halutaan
ohjelman sisään.&lt;&#x2F;p&gt;
&lt;p&gt;Yleensä Linuxissa käännettävät Rust-ohjelmat olettavat
koneesta löytyvän dynaamisesti ladattava  &lt;code&gt;glibc&lt;&#x2F;code&gt;-kirjasto.
&lt;code&gt;glibc&lt;&#x2F;code&gt; soveltuu kuitenkin huonosti staattiseen käännökseen.
Vaikka &lt;code&gt;glibc&lt;&#x2F;code&gt; olisi käännetty staattisesti, se haluaa
silti ladata muutaman alikirjaston dynaamisesti. [3]&lt;&#x2F;p&gt;
&lt;p&gt;Helpointa on käyttää pienempää &lt;code&gt;MUSL&lt;&#x2F;code&gt;-kirjastoa ja kääntää se
staattisesti ohjelmaan.&lt;&#x2F;p&gt;
&lt;p&gt;Kun valitsemme käännöksen target-arkkitehtuuriksi&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;x86_64-unknown-linux-musl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;saamme käyttöön &lt;code&gt;MUSL&lt;&#x2F;code&gt;-kirjaston ja staattisen käännöksen.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä käännöstargetin kääntäjät ja kirjastot saadaan käyttöön
&lt;code&gt;rustup&lt;&#x2F;code&gt;-komennolla&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;rustup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; x86_64-unknown-linux-musl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lisäksi saatetaan tarvita paketit (Debian&#x2F;Ubuntu)
&lt;code&gt;musl-tools&lt;&#x2F;code&gt; ja &lt;code&gt;musl-dev&lt;&#x2F;code&gt;, mutta esimerkissämme
näitä ei tarvita.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;imagen-luonti&quot;&gt;Imagen luonti&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#imagen-luonti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;&#x2F;code&gt; on seuraavan näköinen (Yksinkertaistettu
lähteen [1] esimerkistä.)&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Käännösimage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; rust:latest &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;AS&lt;&#x2F;span&gt;&lt;span&gt; builder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; rustup target add x86_64-unknown-linux-musl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ENV&lt;&#x2F;span&gt;&lt;span&gt; USER=minimal-docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ENV&lt;&#x2F;span&gt;&lt;span&gt; UID=10001&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; adduser \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --disabled-password \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --gecos &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --home &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;nonexistent&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --shell &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;sbin&#x2F;nologin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --no-create-home \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --uid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;${UID}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;${USER}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;WORKDIR&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;minimal-docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; .&#x2F; .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; cargo build --target x86_64-unknown-linux-musl --release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Lopullinen image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; scratch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; --from=builder &#x2F;etc&#x2F;passwd &#x2F;etc&#x2F;passwd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; --from=builder &#x2F;etc&#x2F;group &#x2F;etc&#x2F;group&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;WORKDIR&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;minimal-docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; --from=builder minimal-docker&#x2F;target&#x2F;x86_64-unknown-linux-musl&#x2F;release&#x2F;minimal-docker .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;USER&lt;&#x2F;span&gt;&lt;span&gt; minimal-docker:minimal-docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;CMD&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;minimal-docker&#x2F;minimal-docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä ajetaan hakemistossa, jossa on &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt; ja
&lt;code&gt;src&#x2F;main.rs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;blockquote&gt;
&lt;p&gt;(Vihje: jos olet jo kääntänyt ohjelman paikallisesti,
poista hakemisto &#x2F;target ennen docker buildia.
Mahdollisesti unohtunut &#x2F;target kopioidaan tarpeettomasti
käännösimageen. Sen koko on puolisen gigatavua
ja kopio voi kestää minuutin verran.)&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;yhteenveto&quot;&gt;Yhteenveto&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#yhteenveto&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Tuloksena oleva Docker-image on kooltaan 8,14 MB.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä siis sisältää perustavaran, mutta ainoa
tiedostojärjestelmän tiedosto on staattisesti linkitetty
ohjelma &lt;code&gt;minimal-docker&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(Ja &#x2F;etc&#x2F;passwd ja &#x2F;etc&#x2F;group, joiden avulla
voimme ajaa ohjelman ei-root-käyttäjänä.)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Windowsissa kontin ajo kestää noin viisi sekuntia.&lt;&#x2F;p&gt;
&lt;p&gt;Jos keksit tavan tehdä vielä pienempiä kontteja,
kerro ideasi &lt;a href=&quot;mailto:esa@learners.fi&quot;&gt;esa@learners.fi&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Ratkaisun lähdekoodi (kolme tiedostoa) on ladattavissa&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.learners.fi&#x2F;minimal-docker.zip&quot;&gt;https:&#x2F;&#x2F;blog.learners.fi&#x2F;minimal-docker.zip&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lahteita&quot;&gt;Lähteitä&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#lahteita&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;[1] Sylvain Kerkour, How to create small Docker images for Rust, &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;kerkour.com&#x2F;rust-small-docker-image&#x2F;&quot;&gt;https:&#x2F;&#x2F;kerkour.com&#x2F;rust-small-docker-image&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;[2] Pyry Kontio, Container for building Rust crates for MUSL target &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;rust_musl_docker&#x2F;image&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;rust_musl_docker&#x2F;image&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;[3] Miksi glibc ei toimi staattisesti linkitettynä &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;57476533&#x2F;why-is-statically-linking-glibc-discouraged&quot;&gt;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;57476533&#x2F;why-is-statically-linking-glibc-discouraged&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;[4] James Walker, How to Create Your Own Docker Base Images From “Scratch” &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.howtogeek.com&#x2F;devops&#x2F;how-to-create-your-own-docker-base-images-from-scratch&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.howtogeek.com&#x2F;devops&#x2F;how-to-create-your-own-docker-base-images-from-scratch&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;[5] Scracth-imagen muuttuminen sisäisesti toteutetuksi &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;moby&#x2F;moby&#x2F;pull&#x2F;8827&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;moby&#x2F;moby&#x2F;pull&#x2F;8827&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Päivitys 2024: Vaihdettu James Walkerin linkki toimivaksi.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>FaaS eli WebAssembly as a service</title>
        <published>2021-10-25T00:00:00+00:00</published>
        <updated>2021-10-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/faas/"/>
        <id>./posts/faas/</id>
        
        <content type="html" xml:base="./posts/faas/">&lt;h2 id=&quot;kaupalliset-edge-faas-palvelut&quot;&gt;Kaupalliset Edge FaaS -palvelut&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#kaupalliset-edge-faas-palvelut&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Sekä Fastlyllä että Cloudflarella on
palveluita, joissa voi ajaa WebAssemblyä hyvin
kevyesti Function-as-a-Service eli FaaS-palveluna.&lt;&#x2F;p&gt;
&lt;p&gt;Kummassakin palvelussa asiakas antaa suoritettavan
WebAssembly-tiedoston heille,
ja he asentavat sen kymmeniin reunapalvelimiin ympäri
maailmaa. Aina kun asiakkaan pyyntö triggeröi tämän
palvelun tarpeen, se käynnistetään millisekunneissa
lähimmässä reunapalvelimessa.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fastly&quot;&gt;Fastly&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fastly&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Fastlyn ratkaisussa luodaan WebAssembly-moduuli
Rustilla tai C:llä.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.fastly.com&#x2F;documentation&#x2F;reference&#x2F;compute&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.fastly.com&#x2F;documentation&#x2F;reference&#x2F;compute&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Moduuli käynnistetään yhden HTTP-pyynnön webbiserveriksi.
Se voi lukea pyydetyn URL:n argumentteineen.&lt;&#x2F;p&gt;
&lt;p&gt;Tulos palautetaan HTTP-pyynnön esittäjälle HTML-sivuna.&lt;&#x2F;p&gt;
&lt;p&gt;Tämän lisäksi&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Palvelin voi tehdä HTTP-kyselyjä (mutta ei muuta verkkotoimintaa)&lt;&#x2F;li&gt;
&lt;li&gt;Saa vahvan satunnaisuluvun pyytäessään&lt;&#x2F;li&gt;
&lt;li&gt;Saa kellonajan&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Tämä on kaikki, mitä WebAssembly-ohjelma voi kommunikoida
isäntätietokoneen kanssa.&lt;&#x2F;p&gt;
&lt;p&gt;Fastlyn toteutus on tehty Rustilla.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cloudflare-workers&quot;&gt;Cloudflare workers&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#cloudflare-workers&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Clouflaren ratkaisussa WebAssembly-moduuli on web-palvelin,
joka saa HTTP-pyyntöjä eventteinä, jotka se käsittelee.&lt;&#x2F;p&gt;
&lt;p&gt;CloudFlare käyttää runtimenä V8-JavaScriptiä.&lt;&#x2F;p&gt;
&lt;p&gt;Aikaisemmin pyynnöt oli välitettävä JavaScript ohjelmatynkien
kautta, mutta noin kuukausi sitten tehtiin päivitys, joka sallii
WebAssemblyn saada pyynnöt suoraan ilman JavaScript-koodia.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;learning&#x2F;how-workers-works&quot;&gt;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;learning&#x2F;how-workers-works&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Palvelupyynnön sisällä voidaan käyttää WebSocketteja kutsujan
ja palvelimen tietojenvaihtoon. Tämä on toistaiseksi kokeellinen
ominaisuus.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;&quot;&gt;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;workers&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Cloudflaren WebAssembly-moduuleilla on käytettävissään Key-Value
-tietokanta tietojen pysyvään säilyttämiseen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;miksi-webassembly&quot;&gt;Miksi WebAssembly&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#miksi-webassembly&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;WebAssemblyn vuoksi tarvitaan vain hyvin kevyt runtime-ympäristö.&lt;&#x2F;p&gt;
&lt;p&gt;Koodi ei pääse missään vaiheessa tekemään suoraan systeemikutsuja
tai edes kirjastokutsuja isäntäkoneessa. Tämä takaa täyden turvallisuuden
hyökkäyksiin isäntäkoneeseen. Myöskään isäntäkoneen konekielisiä
käskyjä ei suoriteta suoraan, joten käskykannan HW-bugejakaan ei
päästä hyväksikäyttämään. Esim.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Spectre_(security_vulnerability)&quot;&gt;Spectre-haavoittuvuus.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Kevyt runtime tarkoittaa myös, että suoritus alkaa hyvin nopeasti,
jopa tuhat kertaa nopeammin kuin kontainer-tyyppisen kuorman
käynnistäminen. Yhtäaikaisia suorituksia voi myös olla paljon
enemmän.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Päivitys 2024: Fastlyn linkki vaihdettu toimivaksi.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Miksi WebAssembly-palvelimia</title>
        <published>2021-10-25T00:00:00+00:00</published>
        <updated>2021-10-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/miksi-webassembly-palvelimia/"/>
        <id>./posts/miksi-webassembly-palvelimia/</id>
        
        <content type="html" xml:base="./posts/miksi-webassembly-palvelimia/">&lt;h2 id=&quot;miksi-webassemblya-kannattaa-kayttaa-palvelimissa&quot;&gt;Miksi WebAssemblyä kannattaa käyttää palvelimissa?&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#miksi-webassemblya-kannattaa-kayttaa-palvelimissa&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;WebAssemblyn avuksi tarvitaan vain hyvin kevyt runtime-ympäristö.
Tästä on monia etuja esim. verrattuna Docker-ympäristöön.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;turvallisuus&quot;&gt;Turvallisuus&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#turvallisuus&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Palvelin suorittaa jonkun muun omistamaa koodia. Siksi on tärkeää, että
vieras koodi ei pääse missään vaiheessa tekemään suoraan systeemikutsuja
tai edes kirjastokutsuja isäntäkoneessa. WebAssemblyn kaikki kommunikaatio
isäntäkoneen kanssa tarkastetaan, joten WebAssembly takaa suojan hyökkäyksiin isäntäkonetta vastaan.&lt;&#x2F;p&gt;
&lt;p&gt;Myöskään isäntäkoneen konekielisiä  käskyjä ei suoriteta suoraan, joten
käskykannan HW-bugejakaan ei päästä hyväksikäyttämään. Esim.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Spectre_(security_vulnerability)&quot;&gt;Spectre-haavoittuvuus.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nopeus&quot;&gt;Nopeus&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#nopeus&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Kevyt runtime tarkoittaa myös, että suoritus alkaa hyvin nopeasti,
jopa tuhat kertaa nopeammin kuin kontainer-tyyppisen kuorman
käynnistäminen. Yhtäaikaisia suorituksia voi myös olla paljon
enemmän.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;joustavuus-arkkitehtuurin-suhteen&quot;&gt;Joustavuus arkkitehtuurin suhteen&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#joustavuus-arkkitehtuurin-suhteen&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;WebAssembly-ohjelmia voidaan ajaa täysin identtisesti esimerkiksi Intel- ja
ARM-palvelimissa. Tämä mahdollistaa aina sopivan palvelimen käytön.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kubernetes-ja-webassembly&quot;&gt;Kubernetes ja WebAssembly&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#kubernetes-ja-webassembly&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;WebAssembly-ohjelmia voidaan käyttää osana Kubernetes-klusteria.&lt;&#x2F;p&gt;
&lt;p&gt;Rustilla kirjoitettu Krustlet Kubelet ajaa WebAssebly-podeja
kontainer-podien seassa.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;miksi-jvm-ei-onnistunut-virtuaalisena-konekielena&quot;&gt;Miksi JVM ei onnistunut virtuaalisena konekielenä?&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#miksi-jvm-ei-onnistunut-virtuaalisena-konekielena&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;WebAssembly tavoitteet ovat hyvin samanlaiset, kuin
Javan virtuaalikonekielen, JVM:n alkuperäiset
tavoitteet. Write once, run everywhere. Tämä ei kuitenkaan koskaan
täysin onnistunut.&lt;&#x2F;p&gt;
&lt;p&gt;Java on hyvin raskas järjestelmä, ei ollenkaan yksinkertainen konekieli
kuten WebAssembly. Aikaisemmin ei ole ollut korkean tason tehokasta
staattista muistinvarausta tekevää kieltä kuten Rust, joten
yksinkertaisempaa virtuaalikonekieltä ei ole osattu kaivata.
WebAssembly onkin suorituksessa nopeampi. Paljon nopeampi.&lt;&#x2F;p&gt;
&lt;p&gt;Teoriassa tietenkin esimerkiksi C-ohjelmia voi kääntää
JVM:lle.  Käytännössä tämä on tehty esimerkiksi niin, että
C-ohjelma käännetään hieman akateemiselle MIPS-konekoodille,
ja tehty JVM:llä tulkki tälle konekoodille. Tai kääntämällä
C-lähdekoodi automaattisesti Javaksi ja kääntämällä tämä.
Tämä kuvastaa hyvin, miten sopimaton JVM on konekoodille ja
systeemiohjelmointikielille (C, C++ ja Rust).&lt;&#x2F;p&gt;
&lt;p&gt;JVM:n turvallisuus ei ole aukoton. Sitä ei ole suunniteltu ajamaan
ei-luotettuja vihamielisiä ohjelmia.&lt;&#x2F;p&gt;
&lt;p&gt;JVM kaatui melko paljon siihen, että Oracle osti sen itselleen.
Sen jälkeen, kun Google hävisi oikeudessa paljon rahaa tehtyään
yhteensopivan JVM-virtuaalikoneen, tuskin kukaan uskaltaa tai
viitsii tehdä enää JVM-virtuaalikoneita. (Tosin Goole huijasi
kopioimalla suoraan tiedostoja, mutta se ei muuta tätä lopputulosta.)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Chromessa kriittisiä haavoittuvuuksia, jotka olisi välttänyt käyttämällä Rustia</title>
        <published>2021-09-03T00:00:00+00:00</published>
        <updated>2021-09-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/use-after-free-bugs/"/>
        <id>./posts/use-after-free-bugs/</id>
        
        <content type="html" xml:base="./posts/use-after-free-bugs/">&lt;h2 id=&quot;chromessa-kriittisia-haavoittuvuuksia&quot;&gt;Chromessa kriittisiä haavoittuvuuksia&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chromessa-kriittisia-haavoittuvuuksia&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Google on varoittanut Chromen käyttäjiä viidestä kriittisestä turvallisuusbugista Chromessa.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;High — CVE-2021-30606: Use after free in Blink. Reported by Nan Wang&lt;&#x2F;li&gt;
&lt;li&gt;High — CVE-2021-30607: Use after free in Permissions. Reported by Weipeng Jiang&lt;&#x2F;li&gt;
&lt;li&gt;High — CVE-2021-30608: Use after free in Web Share. Reported by Viettel Cyber Security&lt;&#x2F;li&gt;
&lt;li&gt;High — CVE-2021-30609: Use after free in Sign-In. Reported by raven&lt;&#x2F;li&gt;
&lt;li&gt;High — CVE-2021-30610: Use after free in Extensions API. Reported by Vivaldi&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jokainen näistä virheistä on muistiobjektin käyttö sen vapauttamisen jälkeen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rust-havaitsee-use-after-free-bugit-kaannosaikana&quot;&gt;Rust havaitsee use-after-free -bugit käännösaikana&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-havaitsee-use-after-free-bugit-kaannosaikana&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Kuten muistamme, Rustissa kääntäjä takaa, ettei se päästä läpi ohjemaa, joka yrittää käyttää muistiobjekteja vapautuksen jälkeen.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi seuraava koodi aiheuttaa kääntäjän
virheilmoituksen:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; as_str&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span&gt; s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; format!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Heappiin luodun merkkijonon omistaa muuttuja &lt;code&gt;s&lt;&#x2F;code&gt;, joka
automaattisesti poistetaan funktion lopussa. Muuttujan
poistamisen mukana poistetaan myös automaattisesti
muistiobjektit, jotka se omistaa.
Funktio yrittää kuitenkin palauttaa viittauksen
tuohon olemattomaan merkkijonoon, mikä huomataan
käännösaikana.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tarkempi selitys:&lt;&#x2F;em&gt; &lt;code&gt;format!&lt;&#x2F;code&gt; luo
&lt;code&gt;String&lt;&#x2F;code&gt;-tyyppisen merkkijonon heappiin,
ja sen omistaa &lt;code&gt;s&lt;&#x2F;code&gt;-niminen pinossa oleva muuttuja.
&lt;code&gt;&amp;amp;s&lt;&#x2F;code&gt; luo viittauksen (eli noin C:n pointteri) tuohon
merkkijonoon ja yrittää palauttaa sen funktion
paluuarvona. Muuttuja &lt;code&gt;s&lt;&#x2F;code&gt; kuitenkin katoaa pinosta
funktion lopussa, joten myös &lt;code&gt;String&lt;&#x2F;code&gt;-objekti poistetaan
heapista. Funktion lopussa huomataan, että
objektiin on vielä viittaus, joten se on virhe.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;E0515&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; cannot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; return&lt;&#x2F;span&gt;&lt;span&gt; reference&lt;&#x2F;span&gt;&lt;span&gt; to&lt;&#x2F;span&gt;&lt;span&gt; local&lt;&#x2F;span&gt;&lt;span&gt; variable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; src&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;lib&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;     &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;     ^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span&gt; returns&lt;&#x2F;span&gt;&lt;span&gt; a&lt;&#x2F;span&gt;&lt;span&gt; reference&lt;&#x2F;span&gt;&lt;span&gt; to&lt;&#x2F;span&gt;&lt;span&gt; data&lt;&#x2F;span&gt;&lt;span&gt; owned&lt;&#x2F;span&gt;&lt;span&gt; by&lt;&#x2F;span&gt;&lt;span&gt; the&lt;&#x2F;span&gt;&lt;span&gt; current&lt;&#x2F;span&gt;&lt;span&gt; function&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; aborting&lt;&#x2F;span&gt;&lt;span&gt; due&lt;&#x2F;span&gt;&lt;span&gt; to&lt;&#x2F;span&gt;&lt;span&gt; previous&lt;&#x2F;span&gt;&lt;span&gt; error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;For&lt;&#x2F;span&gt;&lt;span&gt; more&lt;&#x2F;span&gt;&lt;span&gt; information&lt;&#x2F;span&gt;&lt;span&gt; about&lt;&#x2F;span&gt;&lt;span&gt; this&lt;&#x2F;span&gt;&lt;span&gt; error&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; try&lt;&#x2F;span&gt;&lt;span&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;rustc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;explain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; E0515&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;error: could not compile &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;playground&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;To learn more, run the command again with --verbose.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rustin virheilmoitus on tavanomaisen perusteellinen.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa dynaamisilla muistiobjekteilla on aina omistaja
staattisissa pino-objekteissa.
Omistaja ja vain omistaja voi vapauttaa muistiobjektin.
Omistajuus loppuu muistiobjektin vapautukseen, joten
kukaan ei voi yrittää käyttää tai vapauttaa uudelleen
muistiobjektia, joka on jo vapautettu.&lt;&#x2F;p&gt;
&lt;p&gt;Kaikki nämä turvallisuuskriittiset bugit olisi voitu välttää käyttämällä Rust-ohjelmointikieltä.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lisatietoja&quot;&gt;Lisätietoja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#lisatietoja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.forbes.com&#x2F;sites&#x2F;gordonkelly&#x2F;2021&#x2F;09&#x2F;02&#x2F;google-chrome-warning-high-security-hacks-threats-upgrade-chrome-now&quot;&gt;Forbes: Google Issues Warning For 2 Billion Chrome Users&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;ownership.html&quot;&gt;The Rustnomicon: Ownership and Lifetimes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Sulautettu Rust</title>
        <published>2021-08-29T00:00:00+00:00</published>
        <updated>2021-08-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/embedded-rust/"/>
        <id>./posts/embedded-rust/</id>
        
        <content type="html" xml:base="./posts/embedded-rust/">&lt;h2 id=&quot;rust-on-loistava-kieli-sulautettuun-kehityksen&quot;&gt;Rust on loistava kieli sulautettuun kehityksen&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-on-loistava-kieli-sulautettuun-kehityksen&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Yksinkertaisesti Rustia voisi kuvailla
ohjelmointikieleksi, jolla voi tehdä ohjelmia
sulautettuun ympäristöön samalla tarkkuudella kuin
C.&lt;&#x2F;p&gt;
&lt;p&gt;Mutta toisaalta kielessä on paljon korkeamman tason
abstraktioita kuten iteraattorit.
Ohjelmointi muistuttaa siksi tuottavuudeltaan
esimerkiksi Python-ohjelmointia.&lt;&#x2F;p&gt;
&lt;p&gt;Tämän lisäksi Rustilla ohjelmointi tekee ohjelmista
paljon luotettavampia. Rust poistaa C:tä kiusaavat
muistinvarausvirheet.&lt;&#x2F;p&gt;
&lt;p&gt;Rustin merkittävin huono puoli on se, että
se vaatii kieltämättä paljon osaamista.
Se, että Rustilla voi ohjelmoida kaikki hienoudet
tuntien on kuin pitäisi osata kaikki C:n hienoudet,
Pythonin hienoudet ja sitten vielä kolmannes lisää.&lt;&#x2F;p&gt;
&lt;p&gt;Mutta kyllä Rustilla voi ohjelmoida sulautettuja
järjestelmiä ilman hienoimpien piirteiden käyttöä.
C-ohjelmoija voi tuntea olonsa Rustin kanssa
kotoisaksi ilman kovin suurta uuden opettelua.
Mutta silloin kyllä vain raapaistaan pintaa.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa kehittyneemmissä ominaisuuksissa ei ole
kuitenkaan mitään liikaa, turhaa tai tarpeetonta.&lt;&#x2F;p&gt;
&lt;p&gt;Rust on vaikeudesta huolimatta rakastetuin
ohjelmointkieli. Ne, jotka sitä käytävät eivät halua
enää vaihtaa toiseen ohjelmointikieleen. StackOverflowin
kehittäjien kyselyssä 2021 Rust oli rakastetuin
ohjelmointikieli kuudetta vuotta peräkkäin. 87%
Rustin käyttäjistä ei halua siirtyä mihinkään muuhun
kieleen.&lt;&#x2F;p&gt;
&lt;p&gt;Rustin olennaisimmat ominaisuudet sulautetussa
käytössä ovat:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;selkeästi tavupohjaiseen tietokoneeseen määritellyt
tietotyypit (esim. i8, i16, i32, ...)&lt;&#x2F;li&gt;
&lt;li&gt;staattinen tyypitys&lt;&#x2F;li&gt;
&lt;li&gt;tyyppien päättely funktioiden sisällä niin, ettei
hankalaa tyyppimäärittelyä tarvitse useinkaan merkitä,
jos se on muutenkin pääteltävissä&lt;&#x2F;li&gt;
&lt;li&gt;rustin abstraktiot ovat yleensä &quot;zero-cost&quot;
ne helpottavat ohjelmointia, mutta prosessorille
ei niistä tule lisää tekemistä&lt;&#x2F;li&gt;
&lt;li&gt;kyky toimia tarvittaessa kokonaan ilman dynaamista
muistinvarausta, tietyillä edellytyksillä ohjelman
muistinkulutus on ennalta tunnettu&lt;&#x2F;li&gt;
&lt;li&gt;osajoukko standardikirjastosta (Core) antaa
perustoiminnallisuuden, mutta se ei tarvitse
dynaamista muistinhallintaa; se on myös helppo
portata uusiin sulautettuihin prosessoreihin&lt;&#x2F;li&gt;
&lt;li&gt;ei tarvita &quot;runtimeä&quot;, jossa olisi esimerkiksi
roskankeruu; sulautettu Rust-ohjelma on
vain joitakin kilotavuja (noin 20 kB ilman
erikoistemppuiluja), kun minimi Go-ohjelma
on yli puoli megatavua&lt;&#x2F;li&gt;
&lt;li&gt;valmis tuki kaikille tärkeimmille sulautetuille
prosessoreille&lt;&#x2F;li&gt;
&lt;li&gt;Monisäikeisen ohjelman kykyä koskea jaettuihin
muistialueisiin on automaattisesti rajoitettu
turvallisiin operaatioihin jo kielen tasolla&lt;&#x2F;li&gt;
&lt;li&gt;helppo linkittyminen C-funktioihin (FFI)&lt;&#x2F;li&gt;
&lt;li&gt;olio-ohjelmoinnin sijaan täytettävissä on traitit,
jotka toteuttavat osan olio-ohjelmoinnin hyvistä
puolista olio-ohjelmointia tehokkaammin&lt;&#x2F;li&gt;
&lt;li&gt;geneeriset tyypit monistavat saman toiminnallisuuden
eri tyypeille niin, että jokaisen implementointi
optimoidaan erikseen (esim. tavutaulukko ja
merkkijonotaulukko toteutetaan samalla lähdekoodilla,
mutta kummallekin käännetään oma erikseen optimoitu
implementaatio)&lt;&#x2F;li&gt;
&lt;li&gt;erittäin kehittynyt makrojärjestelmä mahdollistaa
sovellusriippuvat tehokkaasti toteutetut abstraktiot&lt;&#x2F;li&gt;
&lt;li&gt;mahdollisuus käyttää asynkronisia IO-funktioita;
näitä voi käyttää kuin säikeitä, mutta odotus
toteutetaan tehokkaalla tilakoneella&lt;&#x2F;li&gt;
&lt;li&gt;mahdollisuus tehdä &quot;unsafe&quot;-operaatioita merkitsemällä
ne; esim. täysin C:n pointtereita vastaavat operaatiot
ovat käytettävissä unsafe-lohkon sisällä&lt;&#x2F;li&gt;
&lt;li&gt;integroitu &quot;make&quot; ja kirjastovarastojen hallinta
nimeltä &lt;code&gt;cargo&lt;&#x2F;code&gt; seuraa parhaita moderneja
paketointikäytäntöjä&lt;&#x2F;li&gt;
&lt;li&gt;valtava määrä valmiita kirjastoja&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;linkkeja&quot;&gt;Linkkejä&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#linkkeja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dev.to&#x2F;abby06&#x2F;rust-for-embedded-development-m00&quot;&gt;Rust for Embedded Development&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.blog&#x2F;2020&#x2F;06&#x2F;05&#x2F;why-the-developers-who-use-rust-love-it-so-much&#x2F;&quot;&gt;Why the developers who use Rust love it so much&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Esimerkkejä Rust-makroista</title>
        <published>2021-08-23T00:00:00+00:00</published>
        <updated>2021-08-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/joitakin-makroja/"/>
        <id>./posts/joitakin-makroja/</id>
        
        <content type="html" xml:base="./posts/joitakin-makroja/">&lt;p&gt;Tässä artikkelissa on joitakin esimerkkejä Rustin makroilla tehdyistä
toiminnoista. Nämä kaikki makrot ovat proseduraalisia eli
ne on toteutettu Rust-ohjelmalla, joka manipuloi Rust-ohjelmaa.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;safe-regex&quot;&gt;safe_regex&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#safe-regex&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;safe_regex::regex!()&lt;&#x2F;code&gt; kääntää säännöllisen lauseen käännösaikana
tilakoneeksi (struct), jolloin käännös ei voi epäonnistua enää
suorituksen aikana.
Tavallisin paketti &lt;code&gt;regex&lt;&#x2F;code&gt; ei tarkista säännöllisiä lauseita
käännösaikana.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;recap&quot;&gt;recap&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#recap&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;recap&lt;&#x2F;code&gt; on proseduraalinen derive-makro, jolla monimutkaiselle
structille voidaan luoda literaali kuvaamalla sen sisältö
säännöllisellä lauseella.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Deserialize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Recap&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;recap&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;regex &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;(?x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    (?P&amp;lt;foo&amp;gt;\d+)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    \s+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    (?P&amp;lt;bar&amp;gt;true|false)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    \s+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    (?P&amp;lt;baz&amp;gt;\S+)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; LogEntry&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    bar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    baz&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  let&lt;&#x2F;span&gt;&lt;span&gt; logs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1 true hello 2 false world&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Literaalin purku tehdään käännösaikana, joten operaatio ei voi
enää suoritusaikana epäonnistua.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;derive-more&quot;&gt;derive_more&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#derive-more&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;derive_more&lt;&#x2F;code&gt; sisältää perusimplementaatiosta puuttuvia yleiskäyttöisiä
derivejä.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi structeille usein määritellään new-niminen
konstruktori, vaikkei Rust sitä edellytäkään monen muun kielen tapaan.
Tämä voidaan tehdä tästä cratesta löytyvällä derivellä Constructor.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Constructor&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; MyInts&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Mikä siis lisää structille tavanomaisen idiomin &lt;code&gt;fn new()&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; MyInts&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;__0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; __1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; i32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; MyInts&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        MyInts&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;__0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; __1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Muita &lt;code&gt;derive_more&lt;&#x2F;code&gt;:sta löytyviä derivejä ovat&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;konversioita, joilla tupleen, structiin tai enumiin
voi sijoittaa lukuja suoraan sisään (vrt. &lt;code&gt;shrinkwraprs&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;yleinen formatointi tyypeille, joilta se puuttuu&lt;&#x2F;li&gt;
&lt;li&gt;peruslaskutoimitukset tupleille, structeille ja enumeille,
jos niissä on yhteensopivat kentät ja niille voidaan tehdä
ko. peruslaskutoimitus keskenään&lt;&#x2F;li&gt;
&lt;li&gt;IsVariant: jos enumin &lt;code&gt;e&lt;&#x2F;code&gt; vaihtoehdot ovat &lt;code&gt;Kissa&lt;&#x2F;code&gt; ja &lt;code&gt;Koira&lt;&#x2F;code&gt;, luodaan
automaattisesti funktiot &lt;code&gt;e.is_kissa()&lt;&#x2F;code&gt; ja &lt;code&gt;e.is_koira()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;yms.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;metered&quot;&gt;metered&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#metered&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;metered&lt;&#x2F;code&gt; -attribuuttimakro lisää funktiolle suoritusnopeusstatistiikan
keräämisen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;strum&quot;&gt;strum&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#strum&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;strum&lt;&#x2F;code&gt; tarjoaa makrot (esim. &lt;code&gt;#[derive(EnumString)&lt;&#x2F;code&gt;) siihen,
että enum-tietotyypin vaihtoehdot
(esim. Red, Green, Blue) ovat käytettävissä ajon aikana myös merkkijonoina
(esim. &quot;red&quot;, &quot;green&quot;, &quot;blue&quot;) tarvitsematta aina luetella, että Red
on sama kuin &quot;red&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Jos enumille on määritelty &lt;code&gt;#[derive(EnumIter)]&lt;&#x2F;code&gt;, enumeraation kaikki
variantit voidaan käydä läpi for-silmukalla &lt;code&gt;for v in e.iter() {}&lt;&#x2F;code&gt;.
Tämä onnistuu vain, jos yhdelläkään variantilla ei ole
vaihtuvia parametreja.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shrinkwraprs&quot;&gt;shrinkwraprs&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shrinkwraprs&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;shrinkwraprs&lt;&#x2F;code&gt; tarjoaa makron &lt;code&gt;#[derive(Shrinkwrap)&lt;&#x2F;code&gt;, jolla luodaan
helposti uusi &quot;johdettu tyyppi&quot; (vrt. esim. &quot;derived type&quot; Adassa).
Johdettu tyyppi toimii täsmälleen samoin kuin alkuperäinen tyyppi, mutta se
ei ole yhteensopiva alkuperäisen kanssa.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi tällä tavalla voidaan luoda merkkijonotyyppi sähköpostiosoite.
Tällöin sitä voi käyttää kuten mitä tahansa muutakin merkkijonoa,
mutta siihen ei voi edes vahingossa sijoittaa tavallista merkkijonotyyppiä
olevaa arvoa ilman funktiota, joka
tarkistaa, että merkkijono edustaa käypää sähköpostiosoitetta.&lt;&#x2F;p&gt;
&lt;p&gt;Shrinkwrap toimii siten, että uusi tyyppi &quot;piilotetaan&quot;
structin sisään tehden siitä epäyhteensopiva muiden samojen
tyyppien kanssa, mutta Shrinkwrap &quot;nostaa&quot; kaikki tämän tyypin operaatiot
käytettäväksi struktille, joka ohjaa ne edelleen &quot;piilotetulle&quot; tyypille.
Siksi nimi on käärimiseen viittaava shrinkwrap.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rocket-www-framework&quot;&gt;Rocket www-framework&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rocket-www-framework&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Yksi Rustin WWW-sovelluspalvelin on Rocket.
Rocket-sovelluksessa kerrotaan attribuuttimakroilla
mitä webbiosoitetta mikäkin funktio palvelee.
Nämä kerätään näkymättömissä yhteen, eikä
pyyntöjen reitittäminen funktioille ole sen
monimutkaisempaa.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;hello&#x2F;&amp;lt;name&amp;gt;&#x2F;&amp;lt;age&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; hello&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; age&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    format!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hello, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; year old named &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; age&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; name&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;launch&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; rocket&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; _&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    rocket&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;build&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mount&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; routes!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;hello&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;sqlx&quot;&gt;sqlx&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#sqlx&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;sqlx on liittymä tietokantoihin, jolla voi antaa
suoraan SQL-kyselyjä. Normaalisti käytetään
funtiota &lt;code&gt;query()&lt;&#x2F;code&gt; tietojen saamiseksi.&lt;&#x2F;p&gt;
&lt;p&gt;Toinen mahdollisuus antaa kyselyjä on makro &lt;code&gt;query!&lt;&#x2F;code&gt;.
Tämä tarkistaa SQL-kyselyn oikeellisuuden jo
käännösaikana suoraan tietokannan skeemasta.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; countries&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; sqlx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;query!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;SELECT country, COUNT(*) as count&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;FROM users&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;GROUP BY country&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;WHERE organization = ?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        organization&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fetch_all&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;pool&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;getset&quot;&gt;getset&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#getset&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;getset&lt;&#x2F;code&gt; tarjoaa derive-makron, joka luo structin kentille getterit
ja setterit. Tämä tarjoittaa sitä, että jos structissa T on kenttä
x, derivellä &lt;code&gt;#[derive(Getters, Setters)]&lt;&#x2F;code&gt; voidaan luoda
automaattisesti funktiot
&lt;code&gt;T.get_x()&lt;&#x2F;code&gt; ja &lt;code&gt;T.set_x()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Gettereitä ja settereitä tarvitaan perinnällisessä olio-ohjelmoinnissa
jossa halutaan kaikkien olion operaatioiden olevan funktioita, jotka
voidaan määritellä perinnässä uudelleen. Rustissa ei ole samanlaista
perintää, vaan olioiden polymorfisuus hoidetaan traiteilla. On siis
kyseenalaista, pitäisikö gettereitä ja settereitä käyttää Rustissa
ollenkaan.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;core-ja-std-kirjastot-eivat-kayta-proseduraalisia-makroja&quot;&gt;core ja std -kirjastot eivät käytä proseduraalisia makroja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#core-ja-std-kirjastot-eivat-kayta-proseduraalisia-makroja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Standardifunktiot voisivat toteuttaa erimerkiksi
&lt;code&gt;print!()&lt;&#x2F;code&gt; -makron proseduraalisena makrona. Lähdekoodia lukiessa
kuitenkin selviää, etteivät &lt;code&gt;core&lt;&#x2F;code&gt; tai &lt;code&gt;std&lt;&#x2F;code&gt; -kirjastot
käytä proseduraalisia makroja.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;print!()&lt;&#x2F;code&gt; -makro kyllä lavennetaan makrona aluksi, mutta
kun on päästy &lt;code&gt;core&lt;&#x2F;code&gt;-kirjaston makroon &lt;code&gt;format_args!()&lt;&#x2F;code&gt;, selviää, että
makron ainoa sisältö on kommentti &quot;compiler built-in&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä oli pieni pettymys, koska tätä ei mainita
dokumentaatiossa.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Rust ilman dynaamista muistinvarausta</title>
        <published>2021-08-10T00:00:00+00:00</published>
        <updated>2021-08-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/heapless-rust/"/>
        <id>./posts/heapless-rust/</id>
        
        <content type="html" xml:base="./posts/heapless-rust/">&lt;h2 id=&quot;milloin-dynaaminen-muistinhallinta-ei-ole-hyva-idea&quot;&gt;Milloin dynaaminen muistinhallinta ei ole hyvä idea?&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#milloin-dynaaminen-muistinhallinta-ei-ole-hyva-idea&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Yleensä tietokoneohjelmissa on totuttu ajatukseen, että
muistia on riittävästi. Jos ohjelmalta loppuu muisti,
se pyytää sitä lisää käyttöjärjestelmältä. Jos käyttöjärjestelmältä
loppuu muisti, se päättää ohjelman suorituksen
tai kriittisessä tapauksessa jonkun muun ohjelman suorituksen.&lt;&#x2F;p&gt;
&lt;p&gt;Joskus tilanne on se, että muistia ei ole paljon eikä
ohjelma saa missään tapauksessa kaatua muistin loppumiseen.
Voimme ajatella esimerkiksi sydämen tahdistajaa.&lt;&#x2F;p&gt;
&lt;p&gt;Myös erittäin kriittisessä palvelinymäristössä on
edullista, ettei muistia käytetä tarpeettomasti dynaamisesti.
Jos dynaamisesti varattu muisti loppuu, pyyntö saada sitä
käyttöjärjelmältä lisää voi aiheuttaa muutaman millisekunnin
pysähdyksen väärässä paikassa. Puhumattakaan roskienkeruun
kymmenistä tai jopa sadoista millisekunneista.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustin-normaali-muistinhallinta&quot;&gt;Rustin normaali muistinhallinta&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rustin-normaali-muistinhallinta&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rust normaalisti säilyttää muistissa olevia tietoja kolmessa
paikassa:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;heap dynaamisesti varatuille objekteille&lt;&#x2F;li&gt;
&lt;li&gt;pino (stack) funktioiden paikallisesti varaamalle muistille&lt;&#x2F;li&gt;
&lt;li&gt;staattinen data, joka varataan ja alustaan ohjelman kanssa pysymään aina samassa paikassae&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Jos tiedämme kuinka syvälle funkiot voivat kutsua toisiaan,
tiedämme pinon maksimikoon. Pinon muisti voi loppua vain, jos
funkiot kutsuvat itseään (suoraan tai epäsuorasti)
eli ne tekevät rekursiivisia kutsuja. Pinon ylivuoto
huomataan.&lt;&#x2F;p&gt;
&lt;p&gt;Rustissa ei ole roskienkeruuta. Kieli takaa, ettei
dynaamisesti varattuja käyttämättömiä muistialueita voi unohtua
muistiin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rust-ohjelmointi-ilman-dynaamista-muistia&quot;&gt;Rust-ohjelmointi ilman dynaamista muistia&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rust-ohjelmointi-ilman-dynaamista-muistia&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Suurimmassa osassa ohjelmointia voidaan selvitä lähes
yhtä hyvin ilman dynaamisesti varattuja muistiohjekteja.
Kaiken tarvittavan muistin koko on tiedettävä silloin
käännösaikana.&lt;&#x2F;p&gt;
&lt;p&gt;Rustin standardikirjasto on jaettu kahteen osaan&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;core - perustoiminnallisuus ilman heappia&lt;&#x2F;li&gt;
&lt;li&gt;std - heappia tarvitsevat toiminnot&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Normaalisti Rust käyttää vain std-kirjastoa, joka
osanaan jakaa tarpeelliset coren toiminnot.&lt;&#x2F;p&gt;
&lt;p&gt;Jos halutaan selvitä ilman heappia, ohjelmatiedostoon lisätään
attribuutti&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ilman standardikirjastoa&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;dynaaminen muisti ei ole käytettävissä&lt;&#x2F;li&gt;
&lt;li&gt;dynaamiset standardityypit eivät ole käytettävissä (String, Vec, HashMap, ...) (mutta huomaa, että stattiset merkkijonot ja tulostuksen formatointiin vaadittavat perusfunktiot ovat coressa mukana, samoin esim. iteraattorit)&lt;&#x2F;li&gt;
&lt;li&gt;libc-kirjastoa ei vaadita&lt;&#x2F;li&gt;
&lt;li&gt;coren voi hyvin helposti portata uusille arkkitehtuureille,
libstd voi sisältää koneriippuvia optimointeja&lt;&#x2F;li&gt;
&lt;li&gt;pinon ylivuotoa ei tarkisteta, ohjelman oletetaan
hoitavan tarkastuksen itse&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;rekursion-muuttaminen-iteraattoriksi&quot;&gt;Rekursion muuttaminen iteraattoriksi&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#rekursion-muuttaminen-iteraattoriksi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Funktio, joka laskee Fibonaccin lukuja Rustilla rekursiivisesti
on esimerkiksi tällainen:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fibonacci&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    match&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        _&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fibonacci&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fibonacci&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Fibonaccin luku on siis luku, joka on kahden edeltävän
Fibonaccin luvun summa.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;1, 1, 2, 3, 5, 8, 13, ...&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Jos tämä käännetään suoraviivaisesti konekoodiksi,
jokainen kutsu aiheuttaa kaksi uutta rekursiivista
kutsua lisäten pinon kokoa. Rekursiiviset funktiot
voivat hyvinkin kasvattaa pinon koon hallitsemattomasti
niin isoksi, että kohdekoneen muisti loppuu.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Kääntäjä yleensä poistaa häntärekursion eli
jos jokaisen haaran lopussa kutsutaan rekursiivisesti
funktiota itseään, funktiokutsu korvataan silmukalla.
Edellisestä ohjelmasta kääntäjä optimoi toisen rekusiivisen
kutsun silmukaksi, mutta ohjelma on kirjoitettavissa siten, että
kummatkin kutsut optimoidaan pois. Ohjelman on
kuitenkin tarkoitus olla esimerkki rekursiosta, joka
voi siis olla paljon monimutkaisempaa kuin tässä
esimerkissä, joten tämä ei nyt ole olennaista.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Saman funktion tekeminen iteraattorina on
monimutkaisempaa, mutta sen tarvitsema tila on
täysin staattinen ja käännösaikana tiedossa.
Lisäksi iteraattoria voi käyttää hyvin monipuolisesti
Rustin funktioilla.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rustin itertools crate voidaan
ottaa käyttöön ilman featurea &lt;code&gt;use_std&lt;&#x2F;code&gt; (päällä
oletuksena), jolloin käytettävissä on vain
toiminnot, jotka eivät tarvitse heappia.
Suurin osa työkaluista on kuitenkin käytettävissä.
Vain unique- ja group-tyyppiset operaatiot
jäävät pois.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    previous&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    current&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        Fib&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            previous&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Initialize fibonacci(0) = 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            current&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Initialize fibonacci(1) = 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Iterator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Option&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Item&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;      let&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;p&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; c&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;previous&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;current&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;previous &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; c&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      self&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;current &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; c&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      Some&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;c&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;take&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Fib&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;nth&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä ohjelma luo iteraattorin, joka palauttaa Fibonaccin
luvut järjestyksessä.&lt;&#x2F;p&gt;
&lt;p&gt;Iteraattorilla on helppo tehdä
paljon monimutkaisempia juttuja kuin pelkällä funktiolla
tai silmukalla. Iteraattori litistää ohjelmassa usein
olevan monimutkaisen hiearkian yksinkertaiseksi
peräkkäiseksi käsittelyksi.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkkiohjelma tulostaa ensin kymmenen ensimmäistä
(&lt;code&gt;take(9)&lt;&#x2F;code&gt;, ensimmäinen on nolla) fibonaccin lukua.
Sitten uudella iteraattorilla
valitsemme kymmenennen parillisen Fibonaccin luvun&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ensin .filter() valitsee parilliset luvut eli ne, jotka ovat kahdella
jaollisia, kahden jakojäännös on nolla.
Sitten nth valitsee
kymmenennen arvon lopputuloksesta (laskenta alkaa nollasta
kuten taulukoillakin, joten kymmenes elementti on nth(9)).
Lopputulos on tyyppiä &lt;code&gt;Option&amp;lt;usize&amp;gt;&lt;&#x2F;code&gt;, koska
iteraattori voi viestittää loppumisesta option arvolla None.
Tässtä tapauksessa iteraattori ei voi loppua.
Luku n täytyy kuitenkin lopuksi ottaa ulos optiorakenteesta Some(n)
funktiolla unwrap().&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Iteraattorin kuluttama muistimäärä on vakio ja pieni koko
läpikäynnin ajan. Yleensä se on yhtä tehokas kuin silmukkarakenne,
mutta sillä on paljon helpompi tehdä operaatioiden monimutkaisia
ketjutuksia.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;heapless-tietotyypit&quot;&gt;Heapless-tietotyypit&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#heapless-tietotyypit&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Rustin kirjastoissa on mukana &lt;code&gt;heapless&lt;&#x2F;code&gt;-crate
joka sisältää tavallisimmat dynaamiset tietotyypit
kuten Vec, String ja IndexMap sellaisina
versioina, että niiden maksimikoko annetaan koodissa
eikä tätä kokoa voi muuttaa. Tällöin niitä voi
käyttää ilman dynaamista muistinhallintaa.&lt;&#x2F;p&gt;
&lt;p&gt;Seuraava koodi on kuin tavallinen Vec-vektori,
mutta vektori on pinossa, ja sen maksimikoko on
kahdeksan alkiota.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; heapless&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Vec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tätä kirjastoa voidaan huoletta käyttää
sulautetussa järjestelemässä, jos tiedetään,
ettei vektorin koko koskaan nouse yli kahdeksaan.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;paaohjelma-joka-ei-tarvitse-dynaamista-muistia&quot;&gt;Pääohjelma, joka ei tarvitse dynaamista muistia&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#paaohjelma-joka-ei-tarvitse-dynaamista-muistia&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Useissa ohjeissa väitetään, että &lt;code&gt;#[no_std]&lt;&#x2F;code&gt;
ratkaisee helposti sen, ettei dynaamista muistinhallintaa
käytetä.
Tämä valitettavasti pätee vain kirjastoihin.
Pääohjelman, joka ei tarvitse dynaamista muistinhallintaa,
tekeminen vaatii paljon lisää vaivaa.&lt;&#x2F;p&gt;
&lt;p&gt;Linux ei nykytilanteessa kykene helposti tuottamaan
omaan käyttöön ohjelmia, jotka selviäisivät ilman
dynaamista muistinhallintaa. Sen sijaan se osaa kyllä
ristikääntää moneen sulautettuun ympäristöön ilman
muistinhallintaa olevia ohjelmia aivan sulavasti.&lt;&#x2F;p&gt;
&lt;p&gt;Tällä hetkellä &lt;code&gt;#[no_std]&lt;&#x2F;code&gt; käynnistää kaikki toiminnot,
jotka olettavat, että ohjelma on menossa ympäristöön, jossa
ei ole ollenkaan käyttöjärjestelmää. Ohjelman on itse
tarjottava poikkeustilanteiden käsittely ja käyttöjärjestelmätön
ohjelman käynnistys.&lt;&#x2F;p&gt;
&lt;p&gt;Nämä toiminnot ovat melko epästabiileja ja dokumentaatio
ei ole täysin ajan tasalla.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;panic&quot;&gt;Panic&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#panic&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Jos pääohjelmassa on &lt;code&gt;no_std&lt;&#x2F;code&gt;, sen on itse tarjottava
funktio, jota kutsutaan, jos ohjelma päätyy panic-virheeseen.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; core&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;panic&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;PanicInfo&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;panic_handler&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; panic&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;_panic&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;PanicInfo&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Huutomerkki paluuarvona kertoo, ettei tämä funktio
koskaan voi palata. Tämä toteutus jää yksinkertaisesti
ikisilmukkaan paniikin tapahtuessa.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;eh-personality&quot;&gt;eh_personality&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#eh-personality&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Toinen funktio, joka tarvitaan on nimeltään &lt;code&gt;eh_personality&lt;&#x2F;code&gt;,
mutta tapa, jolla sen toteutuksen yksinkertaisesti kiertää on
erilainen.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;eh_personality&lt;&#x2F;code&gt; vapauttaa panic-tapauksessa varatun muistin
mahdollisuuksien mukaan. Jos panic-funtio on ikisilmukka,
tästä ei tarvitse kovin paljon välittää.&lt;&#x2F;p&gt;
&lt;p&gt;Tarve kutsua &lt;code&gt;eh_personality&lt;&#x2F;code&gt;-funktiota poistuu, jos
projektin asetustiedostoon Cargo.toml lisätään tähän
määräävät asetukset.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;profile&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;dev&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;panic&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;abort&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;profile&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;release&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;panic&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;abort&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;main&quot;&gt;main()&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#main&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Teoriassa Rustissa pitäisi voida käyttää &lt;code&gt;no_std&lt;&#x2F;code&gt; -asetusta
esimerkiksi Linuxissa ajettavassa ohjelmassa. Se on kuitenkin
käytännössä hyvin vaikeaa.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;no_std&lt;&#x2F;code&gt; -asetuksen kanssa käyttäjän on itse hoidettava myös
ensimmäisen funktion kutsuminen. Teoriassa tämän pitäisi
olla vaadittu vasta, jos määritellään myös &lt;code&gt;no_main&lt;&#x2F;code&gt;, mutta kokeilujeni
perusteella jo &lt;code&gt;no_std&lt;&#x2F;code&gt; vaatii &lt;code&gt;main&lt;&#x2F;code&gt;-funktion muuttamisen.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä pitää hoitaa käyttöjärjestelmästä riippuen
suunnilleen seuraavasti:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_std&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_main&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;no_mangle&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; extern&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; _start&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;missä &lt;code&gt;no_mangle&lt;&#x2F;code&gt; ja &lt;code&gt;pub extern &quot;C&quot;&lt;&#x2F;code&gt; takaa, että &lt;code&gt;_start&lt;&#x2F;code&gt;
on linkkerille ulospäin
näkyvä C-kutsukonventiolla kutsuttava funktio. Käyttöjärjestelmä tms.
pitää sitten saada kutsumaan tuota funktiota.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;linkkaus&quot;&gt;Linkkaus&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#linkkaus&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Ja jäljellä on vielä suurin ongelma. Rust-kääntäjässä
ei ole valmiina kohdearkkitehtuuria &quot;ei käyttöjärjestelmätukea&quot;
esim. Linux-ympäristöön. Standardi käännös-target
&lt;code&gt;x86_64-unknown-linux-gnu&lt;&#x2F;code&gt;
yrittää yhdistää ohelmaan C-kirjastoa, mikä
epäonnistuu, koska std-kirjastoa ei ole mukana.&lt;&#x2F;p&gt;
&lt;p&gt;Linkkaus onnistuu, jos käännöskohde on esimerkiksi sulautettu
ARM-prosessori ilman käyttöjärjestelmää. Esim.
&lt;code&gt;thumbv7em-none-eabihf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Linuxille voidaan määritellä custom käännös-target.
Nykyisen käännös-targetin asetukset saa näkyviin komennolla&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;rustc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; +nightly&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unstable-options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-target=x86_64-unknown-linux&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-print&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; target-spec-json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Asetukset saa yksinkertaisesti &lt;code&gt;--print&lt;&#x2F;code&gt; -valitsimella.
Mutta tämä on käytettävissä vain, jos on valittu
&lt;code&gt;-Z unstable-options&lt;&#x2F;code&gt;.
Mikä taas on saatavissa tällä hetkellä vain &lt;code&gt;nightly&lt;&#x2F;code&gt;
releasen kääntäjässä.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lisatietoja&quot;&gt;Lisätietoja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#lisatietoja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.rust-embedded.org&#x2F;book&#x2F;intro&#x2F;no-std.html&quot;&gt;Embedded Rust Book: A no_std Rust Environment&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;johnthagen&#x2F;min-sized-rust&quot;&gt;Minimizing Rust Binary Size&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;rustc&#x2F;targets&#x2F;custom.html&quot;&gt;Custom Targets&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;unstable-book&#x2F;language-features&#x2F;lang-items.html&quot;&gt;lang_items (#[start])&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;os.phil-opp.com&#x2F;freestanding-rust-binary&#x2F;&quot;&gt;A Freestanding Rust Binary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Rustin proseduraaliset makrot</title>
        <published>2021-07-25T00:00:00+00:00</published>
        <updated>2021-07-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/proseduraalinen-makro/"/>
        <id>./posts/proseduraalinen-makro/</id>
        
        <content type="html" xml:base="./posts/proseduraalinen-makro/">&lt;p&gt;Rust-dokumentaation lopussa kerrotaan proseduraalisista
makroista. Siinä vaiheessa
useimmat meistä pitävät tauon lukemisessa. Dokumentaatio taitaakin
luottaa siihen, sillä dokumentaatio on proseduraalisten makrojen kohdalta
luvattoman huonoa. Dokumentaatio ei ole myöskään ajan tasalla, sillä
proseduraaliset makrot ovat muuttuneet vuoden 2018 Rust-päivityksessä.
Proseduraaliset makrot jäävät helposti epäselviksi pitkäksi aikaa.&lt;&#x2F;p&gt;
&lt;p&gt;Mutta itse asiassa kyse on hyvin yksinkertaisesta asiasta:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Käännöksessä Rust-koodi voidaan esikäsitellä Rust-funktiolla&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Näin koodia voidaan muokata miten vain, ja makron argumenteille
voidaan tehdä myös perusteellinen virhetarkistus.&lt;&#x2F;p&gt;
&lt;p&gt;Tavallisemmat makrot ovat deklaratiivisia. C:ssä makroilla
kerrotaan miten tietyt merkkjonot korvataan toisilla. Rustin
deklaratiiviset makrot ovat kehittyneempiä, ja niillä voi
käsitellä hierarkkisia tokenpuita. Mutta ne eivät ole
varsinaisia ohjelmia.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Token on ohjelmointikielen perusyksikkö. esimerkiksi
luku &lt;code&gt;123&lt;&#x2F;code&gt; on yksi token. Sana &lt;code&gt;let&lt;&#x2F;code&gt; on token.
Rustin makrot saavat argumentteinaan valmiiksi
tokenisoidun Rust-ohjelman, jonka rakenne on myös
Rustin sääntöjen mukaan purettu valmiiksi tokenpuuksi.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Rustin proseduraaliset makrot menevät vielä pidemmälle, ne
ovat oikeita ohjelmia.&lt;&#x2F;p&gt;
&lt;p&gt;Esimerkiksi cratessa &lt;code&gt;hex-literal&lt;&#x2F;code&gt; on proseduraalinen makro
&lt;code&gt;hex!()&lt;&#x2F;code&gt;, joka
muuttaa minkä tahansa heksadesimaaliliteraalin tavutaulukoksi:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; hex!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;00010203 04050607&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; first half&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;08090a0b 0c0d0e0f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; second half&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Perus-Rustilla tämä jouduttaisiin määrittelemään&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0x01&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0x02&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;eli säästetty työmäärä on huomattava ja merkintä on selkeämpi.&lt;&#x2F;p&gt;
&lt;p&gt;Makro &lt;code&gt;hex!()&lt;&#x2F;code&gt; yhdistää merkkijonot ja poistaa kommentit.
Ohjelma näkee makron ajamisen jälkeen makron argumenttien sijaan
kokonaislukutaulukon initialisoinnin heksadesimaaliarvot
muutettuna kokonaislukuliteraaleiksi
(proseduraalinen makro palauttaa suoraan tokeneja,
ei tekstuaalista esitysmuotoa)&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[0, 1, 2, ...]&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Jos makron argumenteissa on virhe, proseduraalinen makro voi
tehdä &lt;code&gt;panic!&lt;&#x2F;code&gt; -keskeytyksen, ja se nähdään kääntäjän virheilmoituksena.
Esimerkiksi jos ensimmäinen nolla jätetään pois, heksadesimaalilukuja
on pariton määrä:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; --&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; src&#x2F;main.rs:4:27&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bytes:&lt;&#x2F;span&gt;&lt;span&gt; [u8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 16]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hex!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  ___________________________^&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;         &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;0010203 04050607&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; first&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; half&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;         &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;08090a0b 0c0d0e0f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; second&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; half&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt;     )&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;_____^&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; help:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; message:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; expected&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; even&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; number&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hex&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; characters&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;error:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; aborting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; due&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; previous&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Makro siis voi tehdä hyvinkin kehittynyttä käsittelyä argumenteilleen.
Se voi tehdä mitä tahansa, koska käsittelijä on Rust-ohjelma.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;proseduraalisen-makron-kaytto&quot;&gt;Proseduraalisen makron käyttö&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#proseduraalisen-makron-kaytto&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Proseduraalisen makron sisältämä crate lisätään normaalisti
&lt;code&gt;cargo.toml&lt;&#x2F;code&gt;-tiedostoon ja makro lisätään &lt;code&gt;use&lt;&#x2F;code&gt;-lauseeseen ilman
huutomerkkiä. Esimerkiksi &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hex-literal&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0.3.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lähdekoodissa:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; hex_literal&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;hex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aikaisemmin Rust vaati proseduraalisten makrojen tuomiseksi
käyttämään lisäksi erityistä &lt;code&gt;macro_use&lt;&#x2F;code&gt; -merkintää jokaisessa
makroja käyttävässä lähdetiedostossa:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;macro_use&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; extern&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; crate&lt;&#x2F;span&gt;&lt;span&gt; hex_literal&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tätä &lt;strong&gt;ei enää tarvita&lt;&#x2F;strong&gt; Rustin versiossa 2018.
Tavallinen use riittää.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ansoja&quot;&gt;Ansoja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ansoja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Huomaa, että proseduraalisen makron on oltava ajokelpoinen
ohjelma siinä vaiheessa, kun sitä käytetään. Siksi se
pitää määritellä eri cratessa kuin missä sitä käytetään.&lt;&#x2F;p&gt;
&lt;p&gt;Proseduraalinen makro ajaa Rust-ohjelman
ilman, että ohjelman kääntäjä sitä tulee ajatelleeksi.
Tämä suoritus ei ole missään suojatussa hiekkalaatikossa
vaan suoraan kehityskoneessa. On mahdollista, että makro
on pahantahtoinen ja tekee ei-haluttuja muutoksia
kehityskoneeseen.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;proseduraalisten-makrojen-tyypit&quot;&gt;Proseduraalisten makrojen tyypit&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#proseduraalisten-makrojen-tyypit&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;hex!() -makro on yleisintä makrotyyppiä eli
funktion näköinen makro. Rustissa nämä voivat olla
deklaratiivisia (määritely erityisellä makrokielellä)
tai proseduraalisia (määritelty Rustilla itsellään).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;attribuuttimakrot&quot;&gt;Attribuuttimakrot&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#attribuuttimakrot&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Toinen makrotyyppi on proseduraaliset attribuuttimakrot.
Nämä näyttävät koodissa tältä&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;attribuuttimakron_nimi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;argumentteja&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; tee_jotain&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; koodia&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tällainen attribuuttimakro saa argumentikseen koko
seuraavan funktion koodin. Se on vapaa muuttamaan
tätä koodia miten haluaa.&lt;&#x2F;p&gt;
&lt;p&gt;Huomaa, etteivät kaikki attribuutit ole makroja.
Osa niistä on sisäänrakennettuja. Esimerkiksi
proseduraalisen makron esittelevä attribuutti
&lt;code&gt;proc_macro&lt;&#x2F;code&gt; ei ole makro. Sitä ei tarvitse ottaa
käyttöön use-lauseella kuten makro pitäisi.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;derive-makrot&quot;&gt;Derive-makrot&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#derive-makrot&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Kolmas proseduraalisen makron tyyppi on &lt;code&gt;derive&lt;&#x2F;code&gt;-makro.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;attribuutti&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tällä voidaan luoda
esimerkiksi structeille puoliautomaattisesti
funktioiden&#x2F;traittien toteutuksia.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;proseduraalisten-makrojen-teko&quot;&gt;Proseduraalisten makrojen teko&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#proseduraalisten-makrojen-teko&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Cratessa, joka määrittelee proseduraalisia makroja tulee
olla attribuutti &lt;code&gt;proc-macro&lt;&#x2F;code&gt; määriteltynä:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;proc-macro&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Proseduraaliset makrot käsittelevät token-jonoja ja
-puita. Koska tämä on työlästä, useimmissa tapauksissa
halutaan käyttää tähän erikoistuneita kirjastoja.&lt;&#x2F;p&gt;
&lt;p&gt;Crate &lt;code&gt;proc-macro&lt;&#x2F;code&gt; on kääntäjän peruspaketti proseduraalisten
makrojen tekemiseen ja &lt;code&gt;TokenStream&lt;&#x2F;code&gt;-tyypin käsittelyyn.&lt;&#x2F;p&gt;
&lt;p&gt;Proseduraalisten makrojen on kuitenkin usein käsiteltävä
myös Rust-koodia tasolla, joka on työlästä pelkällä TokenStream-
tyypillä. Tätä varten on kaksi cratea, &lt;code&gt;syn&lt;&#x2F;code&gt; ja &lt;code&gt;quote&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Syn&lt;&#x2F;code&gt; on Rust-kielen parseri proseduraalisten makrojen
käyttöön.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Quote&lt;&#x2F;code&gt; tokenisoi merkkijonossa olevaa Rust-kieltä.
Koska proseduraalisen makron on palautettava tokeneita,
koodi, jonka haluamme palauttaa sellaisenaan on
muutettava quotella tokeneiksi.&lt;&#x2F;p&gt;
&lt;p&gt;Lisäksi cratella &lt;code&gt;rustc-span&lt;&#x2F;code&gt; voidaan selvittää lähdekoodin
tarkka rivi parempia virheilmoituksia varten.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;funktion-kaltaisen-proseduraalisen-makron-maarittely&quot;&gt;Funktion kaltaisen proseduraalisen makron määrittely&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#funktion-kaltaisen-proseduraalisen-makron-maarittely&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Funtion kaltaista makroa voi käyttää kaikkialla
missä funktiotakin.&lt;&#x2F;p&gt;
&lt;p&gt;Makron määrittelee &lt;code&gt;#[proc_macro]&lt;&#x2F;code&gt; ja funktio,
jonka sisään- ja ulosparametrit ovat tyyppiä
&lt;code&gt;TokenStream&lt;&#x2F;code&gt;. Funktion nimi on makron nimi.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; quote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;quote&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; proc_macro&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;TokenStream&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;proc_macro&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ping&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;_input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TokenStream&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TokenStream&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    TokenStream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;quote!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            info!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Here we are&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä makro tekee yksinkertaisimman mahdollisen asian eli muuttaa
makron&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;ping!();&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Makrokutsuksi&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;info!(&quot;Here we are&quot;);&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Makro ei lue sisään tulevaa TokenStreamia.&lt;&#x2F;p&gt;
&lt;p&gt;Makro &lt;code&gt;info!()&lt;&#x2F;code&gt; tulee paketista &lt;code&gt;log&lt;&#x2F;code&gt;, ja
se tallettaa viestin lokiin vakavuustasolla info.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;proseduraalinen-attribuuttimakro&quot;&gt;Proseduraalinen attribuuttimakro&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#proseduraalinen-attribuuttimakro&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Attribuuttimakro määritellään melko samalla tavalla. Määrittelevä
attribuutti on &lt;code&gt;proc_macro_attribute&lt;&#x2F;code&gt; ja sisääntulevia TokenStreameja
on kaksi, toinen metadatalle.&lt;&#x2F;p&gt;
&lt;p&gt;Seuraava makro &lt;code&gt;#![foo]&lt;&#x2F;code&gt; luo structin &lt;code&gt;Foo{}&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Huomaa, että attribuutit &lt;code&gt;#[]&lt;&#x2F;code&gt; koskevat seuraavaa elementtiä, esim. funktiota,
jonka ne saavat sisääntulevana TokenStreaminä. Huutomerkillä lisättynä
&lt;code&gt;#![]&lt;&#x2F;code&gt; koskee koko yksikköä, missä se on. Muuttujia ja tyyppejä voi siis esitellä &lt;code&gt;#![]&lt;&#x2F;code&gt;-notaatiolla.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; proc_macro&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;TokenStream&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; quote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;quote&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;proc_macro_attribute&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;_metadata&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TokenStream&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; _input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TokenStream&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TokenStream&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    TokenStream&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;quote!&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Monimutkaisempia esimerkkejä löytyy lähteistä.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lisatietoja&quot;&gt;Lisätietoja&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#lisatietoja&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;procedural-macros.html&quot;&gt;The Rust Reference: Procedural Macros&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.logrocket.com&#x2F;macros-in-rust-a-tutorial-with-examples&quot;&gt;Macros in Rust: A tutorial with examples&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch19-06-macros.html#procedural-macros-for-generating-code-from-attributes&quot;&gt;The Rust Programming Language: Procedural Macros for Generating Code from Attributes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.usejournal.com&#x2F;6-useful-rust-macros-that-you-might-not-have-seen-before-59d1386f7bc5?utm_source=pocket_mylist&quot;&gt;6 useful Rust macros that you might not have seen before&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;proc_macro&quot;&gt;Crate proc_macro&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;syn&quot;&gt;crates.io: syn&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;quote&quot;&gt;crates.io: quote&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;hex-literal&#x2F;0.3.3&#x2F;src&#x2F;hex_literal&#x2F;lib.rs.html&quot;&gt;Crate hex-literal, lähdekoodi&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.rust-lang.org&#x2F;2018&#x2F;12&#x2F;21&#x2F;Procedural-Macros-in-Rust-2018.html&quot;&gt;Procedural Macros in Rust 2018&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Python Rustilla ja Webassemblyllä</title>
        <published>2021-07-22T00:00:00+00:00</published>
        <updated>2021-07-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/rustpython/"/>
        <id>./posts/rustpython/</id>
        
        <content type="html" xml:base="./posts/rustpython/">&lt;p&gt;Rustilla on tehty Python-tulkki, jonka nimi
on mielikuvituksettomasti RustPython.&lt;&#x2F;p&gt;
&lt;p&gt;RustPythonin pääsivu on githubissa:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;http:&#x2F;&#x2F;github.com&#x2F;RustPython&#x2F;RustPython&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ohjelman voi kääntää itselle suoraan
cargo-komennolla.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; cargo install --git https:&#x2F;&#x2F;github.com&#x2F;RustPython&#x2F;RustPython&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tämä asentaa ohjelman hakemistoon&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;¨&#x2F;.local&#x2F;.cargo&#x2F;bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;joten tämä hakemisto kannattaa olla bashin
polussa.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; rustpython&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Welcome&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; magnificent&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Rust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0.1.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; interpreter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 😱&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 🖖&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;No&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; previous&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; history.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;webassembly-python&quot;&gt;Webassembly -Python&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#webassembly-python&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Ehkä mielenkiintoisempaa kuin Rustilla tehty Python on se, että Rust osaa
kääntää sujuvasti Webassembly-välikielelle, jota esim. selaimet
tukevat. RustPython on siis saatavissa Webassembly-versiona.&lt;&#x2F;p&gt;
&lt;p&gt;Jos haluat kokeilla Webassemblyksi käännettyä
RustPythonia, voit asentaa sen koneeseesi
Webassembly-pakettimanagerilla wapm.&lt;&#x2F;p&gt;
&lt;p&gt;Wapm on osa Wasmer-pakettia, joka on kokonainen
ympäristö palvelimessa ajettavalle Webassemblylle.
Wasmer on kirjoitettu Rustilla.&lt;&#x2F;p&gt;
&lt;p&gt;Wasmerin asennus Linuxille onnistuu seuraavasti:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; curl https:&#x2F;&#x2F;get.wasmer.io -sSfL &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Kun Wasmer on asennettu, valmis RustPython-Webassembly-paketti
voidaan asentaa seuraavasti:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; wapm install rustpython&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; wapm run rustpython&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tällä tavalla voidaan ajaa Python-ohjelmia containerin sijaan
&quot;kevysandboxissa&quot;.
Webassembly takaa, ettei suoritettava ohjelma voi päästä tunkeutumaan
serverin muihin toimintoihin.&lt;&#x2F;p&gt;
&lt;p&gt;Tästä voi lukea lisää täältä:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;adlrocha.substack.com&#x2F;p&#x2F;adlrocha-can-wasm-become-the-new&quot;&gt;Can WASM become the new Docker?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;thenewstack.io&#x2F;krustlet-brings-webassembly-to-kubernetes-with-a-rust-based-kubelet&#x2F;&quot;&gt;Krustlet Brings WebAssembly to Kubernetes with a Rust-Based Kubelet&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="fi">
        <title>Zola</title>
        <published>2021-07-16T00:00:00+00:00</published>
        <updated>2021-07-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Learners First Oy
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="./posts/zola/"/>
        <id>./posts/zola/</id>
        
        <content type="html" xml:base="./posts/zola/">&lt;p&gt;Jälleen yksi osoitus Rustin sopivuudesta nopeaan komentoriviohjelmointiin
on Zola. Zola on staattisten webbisivujen tekemiseen erikoistunut ohjelma.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;getzola.org&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Vastaavia ohjelmia ovat Pythonilla tehty Pelican ja Golla tehty Hugo.&lt;&#x2F;p&gt;
&lt;p&gt;Tämä sivusto on tehty Zolalla. Se on tehty tarkoituksella hieman nopeasti
tehdyn näköiseksi, jotta se ei pakota tekemään liian hiottuja tekstejä.
Zolalla saa toki tehtyä parempiakin.&lt;&#x2F;p&gt;
&lt;p&gt;Sivut kirjoitetaan Markdown-tekstinä tietyn näköiseen hakemistorakenteeseen,
Tiedostojen yläosaan laitetaan muutama metatieto ja sivusto generoidaan
yhdellä komennolla&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ja sivusto on sekunnissa valmis. Tämä blogin luonti noin kymmenellä sivulla
indeksointeineen kestää 0,4 sekuntia hitaalla tietokoneella.&lt;&#x2F;p&gt;
&lt;p&gt;Jos käynnistetään kehitysserveri, sivuston editointeja voi seurata
reaaliajassa osoitteessa &lt;a rel=&quot;noopener nofollow external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;localhost:1111&quot;&gt;http:&#x2F;&#x2F;localhost:1111&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; serve&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Julkaisua varten valmis sivusto siirretään tuotetusta hakemistosta Amazon S3
buckettiin, joka on konfiguroitu webbipalvelimeksi.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;aws&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; s3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; sync&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; public&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; s3:&#x2F;&#x2F;blog.learners.fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ainoa hankaluus S3:ssa on, ettei siihen helposti saa yhdistettyä
https-sertifikaatteja. Vahtoehtona voi käyttää esim. Cloudflarea.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
