Ik wil dat de leden eigendom zijn van de structuur. Sorry voor de simpele vraag, maar ik kon geen voorbeeld vinden. Ik ben op zoek naar de juiste declaratie van een struct en voorbeelden van instantiatie.
Antwoord 1, autoriteit 100%
Als de string eigendom moet zijn van de struct, dan moet je String
gebruiken. Als alternatief kunt u een &str
gebruiken met een statische levensduur (d.w.z. de levensduur van het programma). Bijvoorbeeld:
struct Foo {
bar: String,
baz: &'static str,
}
fn main() {
let foo = Foo {
bar: "bar".to_string(),
baz: "baz",
};
println!("{}, {}", foo.bar, foo.baz);
}
Als de levensduur van de string onbekend is, kunt u Foo
parametreren met een levensduur:
struct Foo<'a> {
baz: &'a str,
}
Zie ook:
Als u niet zeker weet of de tekenreeks eigendom is of niet (handig om toewijzingen te vermijden), kunt u borrow::Cow
:
use std::borrow::Cow;
struct Foo<'a> {
baz: Cow<'a, str>,
}
fn main() {
let foo1 = Foo {
baz: Cow::Borrowed("baz"),
};
let foo2 = Foo {
baz: Cow::Owned("baz".to_string()),
};
println!("{}, {}", foo1.baz, foo2.baz);
}
Houd er rekening mee dat het type Cow
een leven lang wordt geparametreerd. De levensduur verwijst naar de levensduur van de geleendetekenreeks (d.w.z. wanneer het een Borrowed
is). Als je een Cow
hebt, kun je borrow
gebruiken en een &'a str
krijgen, waarmee je normale tekenreeksbewerkingen kunt uitvoeren zonder zorgen maken over het al dan niet toewijzen van een nieuwe string. Doorgaans is het expliciet aanroepen van borrow
niet vereist vanwege deref-dwang. De waarden van Cow
verwijzen namelijk automatisch naar hun geleende vorm, dus &*val
waarbij val
het type Cow<'a, str>
zal een &str
produceren.