Builder-mønstret
Konstruér objekter trin for trin.
Builder-mønstret er en gratis Lær at programmere i Rust-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lær at programmere i Rust, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Hvorfor en builder?
Rust har ingen navngivne eller valgfrie funktionsargumenter. Når en struktur har mange felter, især valgfrie felter, bliver en konstruktør med otte positionsparametre svær at læse og let at bruge forkert.
Builder-mønsteret løser dette. Du konfigurerer et objekt trin for trin med navngivne metoder og kalder derefter en afsluttende build() for at oprette værdien. Koden læses som en flydende sætning.
Målstrukturen
Start med den type, du faktisk vil oprette. Her indeholder en serverkonfiguration en påkrævet vært samt flere valgfrie indstillinger.
Bemærk, at felterne er private for at tilskynde til oprettelse gennem builderen i stedet for struktur-litteraler.
pub struct ServerConfig {
host: String,
port: u16,
max_connections: usize,
use_tls: bool,
}En separat builder-type
Den klassiske tilgang bruger en ekstra struktur, builderen. Den afspejler målet, men gemmer en igangværende tilstand. Valgfrie felter bliver ofte til Option<T>, så du kan skelne mellem "ikke angivet" og "angivet eksplicit".
pub struct ServerConfigBuilder {
host: String,
port: Option<u16>,
max_connections: Option<usize>,
use_tls: bool,
}Start builderen
Giv builderen en konstruktør, der kun tager de påkrævede felter. Alt valgfrit starter som None eller en standardværdi.
En almindelig konvention er en builder()-metode på måltypen, som returnerer builderen.
impl ServerConfig {
pub fn builder(host: impl Into<String>) -> ServerConfigBuilder {
ServerConfigBuilder {
host: host.into(),
port: None,
max_connections: None,
use_tls: false,
}
}
}Sæt-metoder tager self som værdi
Hver sæt-metode forbruger self, ændrer et felt og returnerer self. Når den ejede værdi returneres, kan du kæde kald sammen på en flydende måde.
Denne ejerskabsbaserede kædning er den idiomatiske Rust-stil og undgår besværlige problemer med levetider.
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
}
}Anvend standardværdier i build()
Den afsluttende build() omdanner builderen til den rigtige type. Her udfylder du standardværdier for alt, der stadig er None, ved hjælp af 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,
}
}
}Flydende oprettelse
Nu læses oprettelsen fra top til bund. Påkrævede data gives til builder(), og hver valgfri justering er et tydeligt navngivet kald.
Felter, du springer over, bruger automatisk deres standardværdier.
fn main() {
let cfg = ServerConfig::builder("localhost")
.port(9000)
.use_tls(true)
.build();
println!("{}:{} tls={}", cfg.host, cfg.port, cfg.use_tls);
}Et komplet eksempel, der kan køres
Her er hele mønsteret samlet i ét program, du kan køre. Det viser, at felter, der springes over, får standardværdier inde i 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);
}Fejltolerant build med Result
Nogle gange kan en konfiguration være ugyldig, f.eks. hvis en port er nul. Lad build() returnere Result, så valideringsfejl kan håndteres i stedet for at udløse panikker.
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 })
}
}Craten derive_builder
Det er gentagelsesarbejde at skrive buildere i hånden. Craten derive_builder genererer hele builderen ud fra en annotation.
Du annoterer felter med standardværdier og får en genereret FooBuilder med sæt-metoder og en fejltolerant build() uden ekstra arbejde.
use derive_builder::Builder;
#[derive(Builder)]
struct Channel {
#[builder(default = "8080")]
port: u16,
name: String,
}Builder med ejerskab kontra builder med mutabel reference
Der findes to stilarter. Den ejede stil forbruger self og kan kædes naturligt. Stilen med &mut self returnerer &mut Self og lader dig fordele oprettelsen over flere sætninger uden at binde variablen igen.
Den ejede stil er mere almindelig til oprettelse i én omgang, mens den mutabele stil egner sig til betinget konfiguration i løkker.
impl ServerConfigBuilder {
pub fn port_ref(&mut self, port: u16) -> &mut Self {
self.port = Some(port);
self
}
}Hurtig kontrol
Test din forståelse af builder-stilen med ejet self.
Opsummering
Builder-mønsteret omgår Rusts mangel på valgfrie argumenter. En builder-type gemmer en igangværende tilstand, sæt-metoder forbruger og returnerer self for at muliggøre kædning, og build() anvender standardværdier for at oprette den endelige værdi.
Brug Result fra build() til validering, og vælg derive_builder, hvis du vil undgå standardkoden.
Lær Rust med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 144
Ofte stillede spørgsmål
Er lektionen “Builder-mønstret” gratis?
Ja — alle 3 lektioner i læringssporet Lær at programmere i Rust, inklusive “Builder-mønstret”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lær at programmere i Rust-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Builder-mønstret”?
Konstruér objekter trin for trin. Du øver dig i Lær at programmere i Rust med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lær at programmere i Rust?
Der kræves ingen tidligere erfaring. Lær at programmere i Rust på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Builder-mønstret”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lær at programmere i Rust-lektion?
Ja. Alle Lær at programmere i Rust-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.