我希望成员归该结构所有。很抱歉这个简单的问题,但是我找不到一个例子。我正在寻找结构和实例化示例的正确声明。
Answers:
如果字符串必须由该结构拥有,则应使用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
类型是在整个生命周期中进行参数化的。生命周期是指借用字符串的生命周期(即a Borrowed
)。如果您有一个Cow
,那么您可以使用borrow
和获取一个&'a str
,通过它您可以执行常规的字符串操作,而不必担心是否分配新的字符串。通常,borrow
由于取消引用强制,因此不需要显式调用。即,Cow
值将自动解除引用其借形式,所以&*val
在那里val
已类型Cow<'a, str>
会产生&str
。
String
是可变的。如果我有一个结构,例如,一个name
应该是不可变的字段,我还是应该使用String
而不是str
?
String
并注意,通过String
from创建一个涉及到堆分配+复制整个字符串。&str
.to_string()