Membawa Jalur ke dalam Lingkup dengan Kata Kunci use
Menulis jalur untuk memanggil fungsi dapat terasa merepotkan dan repetitif. Untungnya, ada cara untuk menyederhanakan proses ini: kita dapat membuat pintasan ke suatu jalur dengan kata kunci use
sekali, dan kemudian menggunakan nama yang lebih pendek di mana pun di dalam lingkup.
Pada Listing 7-5, kita membawa modul restaurant::front_of_house::hosting
ke dalam lingkup fungsi eat_at_restaurant
sehingga kita hanya perlu menyebutkan hosting::add_to_waitlist
untuk memanggil fungsi add_to_waitlist
di dalam eat_at_restaurant
.
Nama File: src/lib.cairo
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_05/src/lib.cairo}}
Listing 7-5: Membawa modul ke dalam lingkup dengan
use
Menambahkan use
dan suatu jalur dalam suatu lingkup mirip dengan membuat symbolic link dalam sistem file. Dengan menambahkan use restaurant::front_of_house::hosting
di akar kerangka, hosting
sekarang adalah nama yang valid di dalam lingkup tersebut, seolah-olah modul hosting
telah didefinisikan di akar kerangka.
Perhatikan bahwa use
hanya membuat pintasan untuk lingkup tertentu di mana use
tersebut terjadi. Listing 7-6 memindahkan fungsi eat_at_restaurant
ke dalam modul anak baru yang diberi nama customer
, yang kemudian menjadi lingkup yang berbeda dari pernyataan use
, sehingga tubuh fungsi tidak akan dikompilasi:
Nama File: src/lib.cairo
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_06/src/lib.cairo}}
Listing 7-6: Pernyataan use
hanya berlaku dalam lingkup
yang ada di dalamnya
Error kompilator menunjukkan bahwa pintasan tidak lagi berlaku di dalam modul customer
:
❯ scarb build
error: Identifier not found.
--> lib.cairo:11:9
hosting::add_to_waitlist();
^*****^
Membuat Jalur use
yang Idiomatik
Pada Listing 7-5, Anda mungkin bertanya-tanya mengapa kita menentukan use restaurant::front_of_house::hosting
dan kemudian memanggil hosting::add_to_waitlist
di
eat_at_restaurant
daripada menentukan jalur use
sampai ke
fungsi add_to_waitlist
untuk mencapai hasil yang sama, seperti pada Listing 7-7.
Nama File: src/lib.cairo
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_07/src/lib.cairo}}
Listing 7-7: Membawa fungsi add_to_waitlist
ke dalam lingkup dengan use
, yang tidak idiomatik
Meskipun keduanya, Listing 7-5 dan 6-7, mencapai tugas yang sama, Listing 7-5 adalah cara yang idiomatik untuk membawa fungsi ke dalam lingkup dengan use
. Membawa modul induk fungsi ke dalam lingkup dengan use
berarti kita harus menyebutkan modul induk saat memanggil fungsi. Menyebutkan modul induk saat memanggil fungsi membuat jelas bahwa fungsi tersebut tidak didefinisikan secara lokal sambil tetap meminimalkan pengulangan dari jalur lengkap. Kode pada Listing 7-7 tidak jelas di mana add_to_waitlist
didefinisikan.
Di sisi lain, ketika membawa dalam struktur, enumerasi, trait, dan item lain dengan menggunakan use
, cara idiomatik adalah dengan menentukan jalur lengkap. Listing 7-8 menunjukkan cara idiomatik membawa trait ArrayTrait
dari pustaka inti ke dalam lingkup.
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_08/src/lib.cairo}}
Listing 7-8: Membawa ArrayTrait
ke dalam lingkup dengan cara
idiomatik
Tidak ada alasan kuat di balik idiom ini: ini hanya konvensi yang muncul dalam komunitas Rust, dan orang-orang telah terbiasa membaca dan menulis kode Rust dengan cara ini. Karena Cairo memiliki banyak idiom yang sama dengan Rust, kami mengikuti konvensi ini juga.
Pengecualian dari idiom ini adalah jika kita membawa dua item dengan nama yang sama ke dalam lingkup yang sama dengan pernyataan use
, karena Cairo tidak mengizinkan hal tersebut.
Memberikan Nama Baru dengan Kata Kunci as
Ada solusi lain untuk masalah membawa dua jenis dengan nama yang sama ke dalam lingkup yang sama dengan use
: setelah jalur, kita dapat menentukan as
dan nama lokal baru, atau alias, untuk jenis tersebut. Listing 7-9 menunjukkan cara Anda dapat mengganti nama impor dengan as
:
Nama File: src/lib.cairo
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_09/src/lib.cairo}}
Listing 7-9: Mengganti nama trait ketika dibawa ke dalam
lingkup dengan kata kunci as
Di sini, kami membawa ArrayTrait
ke dalam lingkup dengan alias Arr
. Sekarang kita dapat mengakses metode-metode trait dengan pengenal Arr
.
Mengimpor beberapa item dari modul yang sama
Ketika Anda ingin mengimpor beberapa item (seperti fungsi, struktur, atau enumerasi) dari modul yang sama di Cairo, Anda dapat menggunakan kurung kurawal {}
untuk mencantumkan semua item yang ingin Anda impor. Ini membantu menjaga kode Anda bersih dan mudah dibaca dengan menghindari daftar panjang pernyataan use
yang terpisah.
Syntax umum untuk mengimpor beberapa item dari modul yang sama adalah:
use module::{item1, item2, item3};
Berikut adalah contoh di mana kita mengimpor tiga struktur dari modul yang sama:
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_10/src/lib.cairo}}
Listing 7-10: Mengimpor beberapa item dari modul yang sama
Mengulang Nama dalam Berkas Modul
Ketika kita membawa suatu nama ke dalam lingkup dengan kata kunci use
, nama yang tersedia dalam lingkup baru dapat diimpor seolah-olah telah didefinisikan dalam lingkup kode tersebut. Teknik ini disebut re-exporting karena kita membawa suatu item ke dalam lingkup, tetapi juga membuat item tersebut tersedia bagi orang lain untuk membawanya ke dalam lingkup mereka.
Sebagai contoh, mari re-export fungsi add_to_waitlist
pada contoh restoran:
Nama File: src/lib.cairo
{{#include ../listings/ch07-managing-cairo-projects-with-packages-crates-and-modules/listing_06_11/src/lib.cairo}}
Listing 7-11: Membuat suatu nama tersedia untuk kode apa pun digunakan
dari lingkup baru dengan pub use
Sebelum perubahan ini, kode eksternal harus memanggil fungsi add_to_waitlist
dengan menggunakan jalur
restaurant::front_of_house::hosting::add_to_waitlist()
. Sekarang bahwa use
ini telah mere-export modul hosting
dari modul akar, kode eksternal
sekarang dapat menggunakan jalur restaurant::hosting::add_to_waitlist()
sebagai gantinya.
Mere-export berguna ketika struktur internal kode Anda berbeda
dengan cara pemrogram yang memanggil kode Anda akan memikirkan domain tersebut. Sebagai
contoh, dalam metafora restoran ini, orang-orang yang menjalankan restoran berpikir
tentang "front of house" dan "back of house." Tetapi pelanggan yang mengunjungi restoran
mungkin tidak akan memikirkan bagian-bagian restoran dengan istilah tersebut. Dengan
use
, kita dapat menulis kode kita dengan satu struktur tetapi mengekspos struktur
yang berbeda. Melakukan hal tersebut membuat perpustakaan kita terorganisir dengan baik untuk pemrogram yang bekerja pada
perpustakaan dan pemrogram yang memanggil perpustakaan tersebut.
Menggunakan Paket Eksternal di Cairo dengan Scarb
Anda mungkin perlu menggunakan paket eksternal untuk memanfaatkan fungsionalitas yang disediakan oleh komunitas. Untuk menggunakan paket eksternal dalam proyek Anda dengan Scarb, ikuti langkah-langkah berikut:
Sistem dependensi masih dalam tahap pengembangan. Anda dapat memeriksa dokumentasi resmi.