Cargo
Mengenal Packages, Crates, & Module
Dalam development software tentunya bertambahnya fitur akan seiring dengan bertambahnya jumlah kode, untuk itu Rust punya beberapa konsep yang mungkin untuk membuat sebuah komponen yang modular.
- Packages adalah paket skeleton project yang siap pakai.
- Crates adalah root dari beberapa module, dan function yang berelasi.
- Modules & use untuk mengontrol ruang lingkup dan privasi dari paths atau bagian dari sistem module.
- Paths adalah sebuah file yang terisolasi untuk mengelompokkan function dan module.
Packages & Crates
Crates adalah kumpulan modules, dan function yang saling berelasi di dalam sebuah package.
cargo new my-projectCreated binary (application) `my-project` packagels my-projectCargo.tomlsrcls my-project/srcmain.rs
Pada contoh diatas perintah cargo new my-project
akan menghasilkan package my-project
didalamnya terdapat direktori src
yang berisi file src/main.rs
dan file Cargo.toml
yang berisi informasi paket pustaka yang kita gunakan, mirip seperti package.json
jika menggunakan NodeJS.
Modules
Setelah membahas tentang package dan crate hal selanjutnya adalah modules, kita akan bahas sedikit tentang bagian-bagian dari sebuah module. Hal yang pertama adalah paths yang digunakan untuk mengelompokkan sebuah fungsi-fungsi dan module dalam sebuah file. Selanjutnya ada use yang merupakan keyword untuk memanggil atau membawa sebuah path kedalam scope yang berbeda, dan pub keyword yang akan membuat sebuah item menjadi publik agar dapat diakses di scope yang berbeda.
Modules membuat kita mudah untuk mengorganisasikan sebuah function berdasarkan fungsinya dan dapat digunakan berkali-kali untuk meminimalisir pekerjaan kita.
Oke, untuk selanjutnya kita akan membuat sebuah paket library di Rust, silakan ketik perintah cargo new --lib my-lib
yang secara otomatis akan membuat skeleton project yang support untuk menerapkan konsep library, dengan option --lib
file yang di generate dalam direktori src
adalah src/lib.rs
berbeda dengan tanpa menggunakan --lib
.
// src/lib.rspub mod restaurant {pub fn hello(name: String) -> String {name}}
Pada contoh kode diatas terdapat sebuah module restaurant dengan function hello()
di dalamnya. Keyword pub digunakan untuk membuat module tersebut bisa diakses dari scope atau path yang berbeda.
Untuk menguji module restaurant tersebut silakan buat file main.rs
, di dalam direktori src/main.rs
isi dengan kode dibawah ini.
// src/main.rsextern crate my_lib;use my_lib::restaurant;fn main() {let adi = restaurant::hello(String::from("adi"));println!("{}", adi);}
Pada kode diatas, kode extern crate my_lib
bertujuan untuk mengambil module yang berada di paths lib.rs
yang merupakan root component, kemudian ada keyword use
tujuannya untuk membawa module restaurant yang ada pada package my_lib
.
Paths untuk mereferensi ke sebuah item di dalam module
Ada dua path yang terkenal di Rust, yaitu, absolute path & relative path, berikut penjelasannya.
- Absolute path diawali dengan keyword crate untuk mengambil modul dari root component.
- Relative path menggunakan self dan super untuk mengambil dari current module.
Dari kedua absolute dan relative paths diatas selanjutnya untuk mengakses module secara spesifik bisa menggunakan semicolons (::)
biar lebih clear
berikut ada contohnya.
// src/lib.rspub mod restaurant {pub fn hello(name: String) -> String {name}}pub fn call_directly() {// Absolute Pathcrate::restaurant::hello();// Relative Pathself::restaurant::hello();}
Keyword pub yang terdapat diawal module dan function bertujuan untuk mengekspos module dan function agar bisa diakses di luar scope, karena secara default module dan function di Rust bersifat private.
Memahami Penggunaan Use
pub mod restaurant {pub fn hello(name: String) -> String {name}}use crate::restaurant;pub fn call_hello_from_restaurant() {restaurant::hello()}
Pada kode diatas, syntax kode use crate::restaurant;
digunakan untuk mengambil module restaurant dari root module dengan menggunakan cara absolute paths.