【发布时间】:2014-09-09 23:03:24
【问题描述】:
我希望成员归结构所有。很抱歉这个简单的问题,但我找不到一个例子。我正在寻找结构和实例化示例的正确声明。
【问题讨论】:
-
使用
String并注意从&str通过.to_string()创建String涉及堆分配+复制整个字符串。
我希望成员归结构所有。很抱歉这个简单的问题,但我找不到一个例子。我正在寻找结构和实例化示例的正确声明。
【问题讨论】:
String 并注意从&str 通过.to_string() 创建String 涉及堆分配+复制整个字符串。
如果字符串必须由结构拥有,那么您应该使用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 字符串的生命周期(即,当它是 Borrowed 时)。如果您有Cow,那么您可以使用borrow 并获得&'a str,您可以使用它进行正常的字符串操作,而无需担心是否分配新字符串。通常,由于 deref 强制,不需要显式调用 borrow。也就是说,Cow 值将自动取消引用到它们的借用形式,因此 &*val 其中val 的类型为Cow<'a, str> 将产生&str。
【讨论】:
String 是可变的。如果我有一个结构,例如,应该是不可变的 name 字段,我是否仍应使用 String 而不是 str?