Я хочу, чтобы члены принадлежали структуре. Извините за простой вопрос, но я не смог найти пример. Я ищу правильное объявление структуры и примеры реализации.
Как создать структуру Rust со строковыми членами?
Ответ 1
Если строка должна принадлежать структуре, вам следует использовать String
. В качестве альтернативы вы можете использовать &str
со статическим временем жизни (т.е. Временем жизни программы). Например:
struct Foo {
bar: String,
baz: &'static str,
}
fn main() {
let foo = Foo {
bar: "bar".to_string(),
baz: "baz",
};
println!("{}, {}", foo.bar, foo.baz);
}
Если время жизни строки неизвестно, вы можете параметризовать Foo
со временем жизни:
struct Foo<'a> {
baz: &'a str,
}
Смотрите также:
Если вы не уверены, будет ли строка принадлежать или нет (полезно для избежания выделения), тогда вы можете использовать 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);
}
Обратите внимание, что тип Cow
параметризован в течение жизни. Время жизни относится к времени жизни заимствованной строки (т.е. Когда она Borrowed
). Если у вас есть Cow
, то вы можете использовать borrow
и получить &'a str
, с помощью которого вы можете делать обычные строковые операции, не заботясь о том, чтобы выделить новую строку или нет. Как правило, явный вызов borrow
не требуется из-за разыменных принуждений. А именно, значения Cow
будут автоматически разыменовываться в заимствованную форму, поэтому &*val
где val
имеет тип Cow<'a, str>
создаст &str
.