0Pricing
Learn Rust Coding · Pelajaran

Pola Builder

Bangun objek langkah demi langkah.

Pola Builder adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.

Mengapa Menggunakan Builder?

Rust tidak memiliki argumen fungsi bernama atau opsional. Ketika sebuah struct memiliki banyak field, terutama field opsional, konstruktor dengan delapan parameter posisi menjadi sulit dibaca dan rentan terhadap kesalahan.

Pola builder mengatasi masalah ini. Anda mengonfigurasi objek langkah demi langkah dengan method bernama, lalu memanggil build() terakhir untuk menghasilkan nilainya. Kodenya terbaca seperti kalimat yang mengalir.

Struct Target

Mulailah dengan tipe yang sebenarnya ingin Anda buat. Di sini, konfigurasi server memiliki host wajib serta beberapa opsi opsional.

Perhatikan bahwa field-nya bersifat private untuk mendorong pembuatan melalui builder, bukan melalui literal struct.

pub struct ServerConfig {
    host: String,
    port: u16,
    max_connections: usize,
    use_tls: bool,
}

Tipe Builder Terpisah

Pendekatan klasik menggunakan struct kedua, yaitu builder. Builder mencerminkan target, tetapi menyimpan state yang sedang dikerjakan. Field opsional sering diubah menjadi Option<T> agar Anda dapat membedakan antara "belum diatur" dan "diatur secara eksplisit".

pub struct ServerConfigBuilder {
    host: String,
    port: Option<u16>,
    max_connections: Option<usize>,
    use_tls: bool,
}

Memulai Builder

Berikan builder sebuah konstruktor yang hanya menerima field wajib. Semua opsi opsional dimulai dengan None atau nilai bawaan.

Konvensi yang umum adalah method builder() pada tipe target yang mengembalikan builder.

impl ServerConfig {
    pub fn builder(host: impl Into<String>) -> ServerConfigBuilder {
        ServerConfigBuilder {
            host: host.into(),
            port: None,
            max_connections: None,
            use_tls: false,
        }
    }
}

Method Setter Menerima self berdasarkan Nilai

Setiap setter mengonsumsi self, mengubah sebuah field, lalu mengembalikan self. Mengembalikan nilai yang dimiliki memungkinkan Anda merangkai pemanggilan secara lancar.

Perangkaian berbasis kepemilikan ini merupakan gaya Rust yang idiomatis dan menghindari kerumitan lifetime.

impl ServerConfigBuilder {
    pub fn port(mut self, port: u16) -> Self {
        self.port = Some(port);
        self
    }
    pub fn use_tls(mut self, yes: bool) -> Self {
        self.use_tls = yes;
        self
    }
}

Menerapkan Nilai Bawaan dalam build()

build() terminal mengubah builder menjadi tipe sebenarnya. Di sinilah Anda mengisi nilai bawaan untuk apa pun yang masih berupa None menggunakan unwrap_or.

impl ServerConfigBuilder {
    pub fn build(self) -> ServerConfig {
        ServerConfig {
            host: self.host,
            port: self.port.unwrap_or(8080),
            max_connections: self.max_connections.unwrap_or(128),
            use_tls: self.use_tls,
        }
    }
}

Pembuatan yang Lancar

Sekarang proses pembuatan terbaca dari atas ke bawah. Data wajib dimasukkan ke builder(); setiap penyesuaian opsional berupa pemanggilan dengan nama yang jelas.

Field yang dilewati akan menggunakan nilai bawaannya secara diam-diam.

fn main() {
    let cfg = ServerConfig::builder("localhost")
        .port(9000)
        .use_tls(true)
        .build();
    println!("{}:{} tls={}", cfg.host, cfg.port, cfg.use_tls);
}

Contoh Lengkap yang Dapat Dijalankan

Berikut seluruh pola yang diringkas menjadi satu program yang dapat Anda jalankan. Contoh ini menunjukkan bahwa field yang dilewati akan menggunakan nilai bawaan di dalam build().

struct Config { name: String, retries: u32 }
struct Builder { name: String, retries: Option<u32> }
impl Config {
    fn builder(name: &str) -> Builder {
        Builder { name: name.to_string(), retries: None }
    }
}
impl Builder {
    fn retries(mut self, n: u32) -> Self { self.retries = Some(n); self }
    fn build(self) -> Config {
        Config { name: self.name, retries: self.retries.unwrap_or(3) }
    }
}
fn main() {
    let c = Config::builder("job").build();
    println!("{} retries={}", c.name, c.retries);
}

build yang Dapat Gagal dengan Result

Terkadang konfigurasi dapat menjadi tidak valid, misalnya port bernilai nol. Buat build() mengembalikan Result agar kegagalan validasi muncul sebagai error yang dapat dipulihkan, bukan panic.

impl ServerConfigBuilder {
    pub fn try_build(self) -> Result<ServerConfig, String> {
        let port = self.port.unwrap_or(8080);
        if port == 0 {
            return Err("port must be non-zero".into());
        }
        Ok(ServerConfig { host: self.host, port,
            max_connections: self.max_connections.unwrap_or(128),
            use_tls: self.use_tls })
    }
}

Crate derive_builder

Menulis builder secara manual bersifat repetitif. Crate derive_builder menghasilkan seluruh builder dari sebuah anotasi.

Anda memberi anotasi pada field dengan nilai bawaan dan mendapatkan FooBuilder yang dibuat secara otomatis, lengkap dengan setter dan build() yang dapat gagal.

use derive_builder::Builder;

#[derive(Builder)]
struct Channel {
    #[builder(default = "8080")]
    port: u16,
    name: String,
}

Builder dengan Nilai Dimiliki vs Referensi Mutable

Ada dua gaya. Gaya nilai dimiliki mengonsumsi self dan dapat dirangkai secara alami. Gaya &mut self mengembalikan &mut Self dan memungkinkan Anda membagi proses pembuatan ke beberapa pernyataan tanpa menetapkan ulang variabel.

Gaya nilai dimiliki lebih umum untuk pembuatan sekali jalan; gaya mutable cocok untuk konfigurasi bersyarat dalam loop.

impl ServerConfigBuilder {
    pub fn port_ref(&mut self, port: u16) -> &mut Self {
        self.port = Some(port);
        self
    }
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang gaya builder dengan self yang dimiliki.

Ringkasan

Pola builder mengatasi ketiadaan argumen opsional di Rust. Tipe builder menyimpan state yang sedang dikerjakan, setter mengonsumsi dan mengembalikan self untuk perangkaian, dan build() menerapkan nilai bawaan untuk menghasilkan nilai akhir.

Gunakan Result dari build() untuk validasi, dan gunakan derive_builder agar tidak perlu menulis kode repetitif.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Builder” gratis?

Ya — teks lengkap “Pola Builder” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pola Builder”?

Bangun objek langkah demi langkah. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?

Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pola Builder” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?

Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pola Builder
  2. Pola Newtype
  3. Builder Berbasis Keadaan Tipe
  4. Ergonomi Deref dan Pembungkus
← Kembali ke Learn Rust Coding