Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Laajuuden ja yksityisyyden hallinta moduuleilla

Tässä osiossa käsittelemme moduuleja ja moduulijärjestelmän muita osia, nimittäin polkuja, joiden avulla voit nimetä kohteita; use-avainsanaa, joka tuo polun laajuuteen; ja pub-avainsanaa, jolla kohteet tehdään julkisiksi. Käsittelemme myös as-avainsanaa, ulkoisia paketteja ja glob-operaattoria.

Moduulien pikaopas

Ennen kuin siirrymme moduulien ja polkujen yksityiskohtiin, tässä on nopea viite siitä, miten moduulit, polut, use-avainsana ja pub-avainsana toimivat kääntäjässä ja miten useimmat kehittäjät järjestävät koodinsa. Käymme läpi esimerkkejä jokaisesta näistä säännöistä koko luvun ajan, mutta tämä on hyvä paikka muistuttaa itseään moduulien toiminnasta.

  • Aloita crate-juuresta: Kun crate käännetään, kääntäjä etsii ensin crate-juuritiedostosta (yleensä src/lib.rs kirjastocrate:lle ja src/main.rs binääricrate:lle) käännettävää koodia.
  • Moduulien määrittely: Crate-juuritiedostossa voit määritellä uusia moduuleja; oletetaan, että määrittelet ”garden”-moduulin komennolla mod garden;. Kääntäjä etsii moduulin koodia näistä paikoista:
    • Inline, aaltosulkeissa, jotka korvaavat mod garden -lauseen lopussa olevan puolipisteen
    • Tiedostosta src/garden.rs
    • Tiedostosta src/garden/mod.rs
  • Alimoduulien määrittely: Missä tahansa tiedostossa paitsi crate-juuressa voit määritellä alimoduuuleja. Esimerkiksi voit määritellä mod vegetables; tiedostossa src/garden.rs. Kääntäjä etsii alimoduuulin koodia emomoduulin nimisestä hakemistosta näistä paikoista:
    • Inline, suoraan mod vegetables -lauseen jälkeen aaltosulkeissa puolipisteen sijaan
    • Tiedostosta src/garden/vegetables.rs
    • Tiedostosta src/garden/vegetables/mod.rs
  • Polut moduulien koodiin: Kun moduuli on osa crate:asi, voit viitata kyseisen moduulin koodiin mistä tahansa muualta samassa crate:ssa, kunhan yksityisyyssäännöt sen sallivat, käyttämällä polkua koodiin. Esimerkiksi Asparagus-tyyppi garden-moduulin vegetables-alimoduuulissa löytyy polusta crate::garden::vegetables::Asparagus.
  • Yksityinen vs. julkinen: Moduulin sisällä oleva koodi on oletuksena yksityistä emomoduuleilleen. Tehdäksesi moduulin julkiseksi, määrittele se komennolla pub mod mod-komennon sijaan. Tehdäksesi julkisen moduulin kohteet myös julkisiksi, käytä pub-avainsanaa niiden määrittelyjen edessä.
  • use-avainsana: Laajuudessa use-avainsana luo oikoteitä kohteille vähentääkseen pitkien polkujen toistoa. Missä tahansa laajuudessa, jossa voidaan viitata crate::garden::vegetables::Asparagus-polkuun, voit luoda oikotien komennolla use crate::garden::vegetables::Asparagus;, ja sen jälkeen sinun tarvitsee vain kirjoittaa Asparagus käyttääksesi kyseistä tyyppiä laajuudessa.

Tässä luomme binääricrate:n nimeltä backyard, joka havainnollistaa näitä sääntöjä. Crate:n hakemisto, joka myös on nimeltään backyard, sisältää nämä tiedostot ja hakemistot:

backyard
├── Cargo.lock
├── Cargo.toml
└── src
    ├── garden
    │   └── vegetables.rs
    ├── garden.rs
    └── main.rs

Tässä tapauksessa crate-juuritiedosto on src/main.rs, ja se sisältää:

Filename: src/main.rs
{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/main.rs}}

pub mod garden; -rivi kertoo kääntäjälle sisällyttää koodi, jonka se löytää tiedostosta src/garden.rs, joka on:

Filename: src/garden.rs
{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/garden.rs}}

Tässä pub mod vegetables; tarkoittaa, että koodi tiedostosta src/garden/vegetables.rs sisällytetään myös. Kyseinen koodi on:

{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/garden/vegetables.rs}}

Siirrytään nyt näiden sääntöjen yksityiskohtiin ja havainnollistetaan niitä käytännössä!

Liittyvän koodin ryhmittely moduuleihin

Moduulit antavat meille mahdollisuuden järjestää koodia crate:n sisällä luettavuuden ja helpon uudelleenkäytön vuoksi. Moduulit antavat myös hallita kohteiden yksityisyyttä, koska moduulin sisällä oleva koodi on oletuksena yksityistä. Yksityiset kohteet ovat sisäisiä toteutustietoja, jotka eivät ole ulkopuolisen käytön saatavilla. Voimme valita tehdä moduulit ja niiden sisällä olevat kohteet julkisiksi, mikä paljastaa ne ulkoisen koodin käytettäväksi ja riippuvuudeksi.

Esimerkkinä kirjoitetaan kirjastocrate, joka tarjoaa ravintolan toiminnallisuuden. Määrittelemme funktioiden signatuurit, mutta jätämme niiden rungot tyhjiksi keskittyäksemme koodin organisointiin ravintolan toteutuksen sijaan.

Ravintola-alalla ravintolan osia kutsutaan etu- ja takaosaksi. Etuosassa asiakkaat ovat; se kattaa paikat, joissa emännät istuttavat asiakkaat, tarjoilijat ottavat tilaukset ja maksut, ja baarimestarit valmistavat juomia. Takaosassa keitit ja kokit työskentelevät keittiössä, tiskinpesijät siivoavat, ja esimiehet tekevät hallinnollista työtä.

Rakentaaksemme crate:amme tällä tavalla voimme järjestää sen funktiot sisäkkäisiin moduuleihin. Luo uusi kirjasto nimeltä restaurant suorittamalla cargo new restaurant --lib. Syötä sitten listauksen 7-1 koodi tiedostoon src/lib.rs määritelläksesi moduuleja ja funktiosignatuureja; tämä koodi on etuosan osio.

Filename: src/lib.rs
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-01/src/lib.rs}}
Listing 7-1: front_of_house-moduuli, joka sisältää muita moduuleja, jotka sisältävät funktioita

Määrittelemme moduulin mod-avainsanalla, jota seuraa moduulin nimi (tässä tapauksessa front_of_house). Moduulin runko menee sitten aaltosulkeiden sisään. Moduulien sisällä voimme sijoittaa muita moduuleja, kuten tässä tapauksessa moduulit hosting ja serving. Moduulit voivat myös sisältää määrittelyjä muille kohteille, kuten structeille, enumeille, vakioille, trait:eille ja kuten listauksessa 7-1 funktioille.

Moduuleja käyttämällä voimme ryhmitellä liittyvät määrittelyt yhteen ja nimetä, miksi ne liittyvät toisiinsa. Tätä koodia käyttävät ohjelmoijat voivat navigoida koodissa ryhmien perusteella sen sijaan, että heidän pitäisi lukea läpi kaikki määrittelyt, mikä helpottaa heille relevanttien määrittelyjen löytämistä. Tähän koodiin uutta toiminnallisuutta lisäävät ohjelmoijat tietävät, mihin sijoittaa koodin pitääkseen ohjelman järjestyksessä.

Aiemmin mainitsimme, että src/main.rs ja src/lib.rs kutsutaan crate-juuriksi. Niiden nimen syy on se, että kummankin näistä kahdesta tiedostosta sisältö muodostaa moduulin nimeltä crate crate:n moduulirakenteen juuressa, jota kutsutaan moduulipuuksi.

Listaus 7-2 näyttää moduulipuun listauksen 7-1 rakenteelle.

crate
 └── front_of_house
     ├── hosting
     │   ├── add_to_waitlist
     │   └── seat_at_table
     └── serving
         ├── take_order
         ├── serve_order
         └── take_payment
Listing 7-2: Moduulipuu listauksen 7-1 koodille

Tämä puu näyttää, miten jotkin moduulit sisäkkäistyvät muihin moduuleihin; esimerkiksi hosting sisäkkäistyy front_of_house-moduuliin. Puu näyttää myös, että jotkin moduulit ovat sisaruksia, eli ne on määritelty samassa moduulissa; hosting ja serving ovat sisaruksia, jotka on määritelty front_of_house-moduulissa. Jos moduuli A on moduulin B sisällä, sanomme, että moduuli A on moduulin B lapsi ja moduuli B on moduulin A vanhempi. Huomaa, että koko moduulipuu on juurrutettu implisiittiseen moduuliin nimeltä crate.

Moduulipuu saattaa muistuttaa tietokoneesi tiedostojärjestelmän hakemistopuuta; tämä on erittäin osuva vertaus! Aivan kuten hakemistot tiedostojärjestelmässä, käytät moduuleja koodisi organisointiin. Ja aivan kuten tiedostot hakemistossa, tarvitsemme tavan löytää moduulimme.