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
- Inline, aaltosulkeissa, jotka korvaavat
- 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
- Inline, suoraan
- 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 polustacrate::garden::vegetables::Asparagus. - Yksityinen vs. julkinen: Moduulin sisällä oleva koodi on oletuksena yksityistä emomoduuleilleen. Tehdäksesi moduulin julkiseksi, määrittele se komennolla
pub modmod-komennon sijaan. Tehdäksesi julkisen moduulin kohteet myös julkisiksi, käytäpub-avainsanaa niiden määrittelyjen edessä. use-avainsana: Laajuudessause-avainsana luo oikoteitä kohteille vähentääkseen pitkien polkujen toistoa. Missä tahansa laajuudessa, jossa voidaan viitatacrate::garden::vegetables::Asparagus-polkuun, voit luoda oikotien komennollause crate::garden::vegetables::Asparagus;, ja sen jälkeen sinun tarvitsee vain kirjoittaaAsparaguskä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ää:
{{#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:
{{#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.
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-01/src/lib.rs}}
front_of_house-moduuli, joka sisältää muita moduuleja, jotka sisältävät funktioitaMää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
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.