struct
3 types of struct
- regular (C-like) struct
#[derive(Debug)] struct Person { name : String, age : f32 } fn main() { let ryan = Person { name : "Ryan".to_string(), age : 6.3 }; println!("{:?}", ryan); /* field punning */ let name = "Ryan".to_string(); let age = 6.3; let ryan = Person { name, age }; // <- println!("{:?}", ryan); /* with pattern match */ let Person { name, age } = ryan; println!("{name}, {age}"); /* spreading, assign fields */ let Person { name : n, age : a } = Person { name : "Ryan Clone".to_string(), .. ryan } ; println!("{n}, {a}"); }
- tuple struct
#![allow(unused)] fn main() { struct Person(String, f32); }
- unit struct
#![allow(unused)] fn main() { struct Any; struct Never; struct Unit; }
A struct with some methods
extern crate chrono; use chrono::format::ParseResult; use chrono::prelude::*; use std::fmt; struct Lang { name: String, type_system: String, created_at: ParseResult<NaiveDate>, } impl Lang { fn new(name: &str, type_system: &str, created_at: &str) -> Lang { Lang { name: name.to_string(), type_system: type_system.to_lowercase(), created_at: NaiveDate::parse_from_str(created_at, "%d/%m/%Y"), } } } impl fmt::Display for Lang { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let d = if let Ok(d) = self.created_at { d.format("%d/%m/%Y").to_string() } else { "".to_string() }; write!( f, "name : {}, type_system : {}, created_at : {}", self.name, self.type_system, d ) } } fn main() { let rust = Lang::new("Rust", "Strong, Static", "1/1/2010"); println!("{rust}"); }