- Datentypen werden über das Schlüsselwort
struct
definiert
- Datentypen können auch keinerlei Inhalt haben
- Wrapper für die Kappselung von anderen Datentypen
- Implementierungen für
structs
- Mittels Macros können verschiedene Eigenschaften hinzugefügt werden, bspw.
- Kopierverhalten
- Bereitstellung einer Debug-Darstellung
- Sonstige Erweiterungen für bspw. Datenbankeigenschaften
#[derive(Debug)]
struct OneValue {
value: u32,
}
#[derive(Debug)]
struct Empty { }
#[derive(Debug)]
struct Wrapper(u32);
impl OneValue {
fn new() -> Self {
OneValue {
value: 0,
}
}
fn do_something(&self) {
println!("My value is {}", self.value);
}
fn change_something(&mut self) {
self.value += 1;
}
}
impl Empty {
fn do_something_static() {
println!("A voice from the void");
}
}
fn main() {
let mut one_value = OneValue::new();
one_value.do_something();
one_value.change_something();
let empty = Empty { };
Empty::do_something_static();
let wrapped = Wrapper (1);
// Ausgabe über Debug-Macro
println!("one_value = {:?}", one_value);
println!("empty = {:?}", empty);
println!("wrapped = {:?}", wrapped);
}
- Enums orienteren sich an der C-Notation
- Enums können aber mit weiteren Strukturen erweitert werden
- Auch Enums können mit Macros erweitert werden
// Unterstützung für Gleichheits-Operator
#[derive(Debug,PartialEq)]
enum Status {
Ok,
GenericError(String),
ApplicationError { prio: u32, cause: String },
}
impl Status {
fn am_i_ok(&self) -> bool {
*self == Status::Ok
}
}
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
fn main() {
let result: Status = Status::Ok;
println!("Ok {:?}", result);
println!("Ok? {:?}", result.am_i_ok());
let result = Status::GenericError(String::from("Something went wrong"));
println!("{:?}", result);
let result = Status::ApplicationError { prio: 1, cause: String::from("Something more specific") };
println!("{:?}", result);
}