假设我定义了一个带有字符串字段的结构体。该字段应:1.能够持有字符串所有权(例如,当我想用生成的值format填充它时),1.也可以保存一个不可变的引用(在字符串已经被其他地方拥有的情况下,我不想浪费时间克隆它)。在Rust中我该如何表达(“&str或String”)?
format
&str
String
3pvhb19x1#
有一个内置类型std::borrow::Cow(CloneOnWrite的缩写)。通过指定Cow<'a, str>,可以存储&'a str和String。Cow derefs到str,因此您可以调用str方法,并在需要调用String方法时提供to_mut()和into_owned()方法。
std::borrow::Cow
Cow<'a, str>
&'a str
Cow
str
to_mut()
into_owned()
jei2mxaa2#
std::borrow::Cow类型对于您的用例来说已经足够了,正如另一个答案中所建议的那样。如果你想要一些带有额外约束的自定义类型,你可以尝试定义你自己的枚举,如下所示。在Rust中,可以使用枚举来表示可以保存String或& str的字段。枚举允许您定义一个可以有多个变量的类型,每个变量都有自己的数据。
enum MyString { Owned(String), Borrowed(&'static str), } struct MyStruct { field: MyString, }
字符串在上面的例子中,MyString枚举有两个变体:Owned,它保存一个String并表示所拥有的字符串所有权; Borrowed,它保存一个&str并表示对字符串的不可变引用。然后,您可以使用MyStruct结构体,并根据需要使用String或&str填充字段。
2条答案
按热度按时间3pvhb19x1#
有一个内置类型
std::borrow::Cow
(CloneOnWrite的缩写)。通过指定Cow<'a, str>
,可以存储&'a str
和String
。Cow
derefs到str
,因此您可以调用str
方法,并在需要调用String
方法时提供to_mut()
和into_owned()
方法。jei2mxaa2#
std::borrow::Cow类型对于您的用例来说已经足够了,正如另一个答案中所建议的那样。如果你想要一些带有额外约束的自定义类型,你可以尝试定义你自己的枚举,如下所示。
在Rust中,可以使用枚举来表示可以保存String或& str的字段。枚举允许您定义一个可以有多个变量的类型,每个变量都有自己的数据。
字符串
在上面的例子中,MyString枚举有两个变体:Owned,它保存一个String并表示所拥有的字符串所有权; Borrowed,它保存一个&str并表示对字符串的不可变引用。
然后,您可以使用MyStruct结构体,并根据需要使用String或&str填充字段。