我希望结构体拥有成员。我正在寻找结构体的正确声明和实例化示例,但我没有找到示例。
String
。或者,您可以使用具有静态生存期(即程序的生存期)的&str
。例如:
如果字符串必须由结构体拥有,那么您应该使用 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
值会自动解引用为其借用形式,因此类型为 Cow<'a, str>
的 val
变量可以使用 &*val
获得一个 &str
。
String
而不是Box<str>
有什么理由吗? - The Zach ManBox<str>
似乎是正确的选择。 - BurntSushi5
String
,请注意通过.to_string()
从&str
创建String
将涉及堆分配和复制整个字符串。 - sellibitze