我希望成员由结构体拥有。我正在寻找正确的结构体声明和示例化示例。我无法找到示例。
waxmsbnn1#
如果字符串必须由结构拥有,则应使用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); }
如果字符串的生存期未知,那么可以用一个lifetime参数化Foo:
Foo
struct Foo<'a> { baz: &'a str, }
另见:
str
如果你不确定字符串是否会被拥有(这对避免分配很有用),那么你可以使用borrow::Cow:
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。
Cow
Borrowed
borrow
&'a str
&*val
val
Cow<'a, str>
1条答案
按热度按时间waxmsbnn1#
如果字符串必须由结构拥有,则应使用
String
。或者,可以使用具有静态生存期(即程序的生存期)的&str
。例如:如果字符串的生存期未知,那么可以用一个lifetime参数化
Foo
:另见:
String
andstr
?如果你不确定字符串是否会被拥有(这对避免分配很有用),那么你可以使用
borrow::Cow
:注意,
Cow
类型是在生存期内参数化的,生存期指的是 borrowed 字符串的生存期(即当它是一个Borrowed
时),如果你有一个Cow
,那么你可以使用borrow
并得到一个&'a str
,用它你可以做普通的字符串操作,而不用担心是否分配一个新的字符串,通常情况下,由于deref强制,不需要显式调用borrow
。也就是说,Cow
值将自动解引用到其借用形式,因此&*val
(其中val
具有Cow<'a, str>
类型)将生成&str
。