Design patterns 在铁锈中,什么';当您有时需要一个引用持有结构来拥有其引用的数据时,它的模式是什么?

Design patterns 在铁锈中,什么';当您有时需要一个引用持有结构来拥有其引用的数据时,它的模式是什么?,design-patterns,rust,borrow-checker,Design Patterns,Rust,Borrow Checker,考虑以下数据结构: struct ReferenceHoldingStruct ReferenceHoldingStruct{ ReferenceHoldingStruct{prop:input.as_str()} } 我理解为什么这个版本不起作用:所引用的字符串并不存在于Rust可以看到它将挂起以继续实现结构的&str引用的任何地方。我想也许这会奏效: fn生成\u这些\u 2){ (input,ReferenceHoldingStruct{prop:input.as_str()}) }

考虑以下数据结构:

struct ReferenceHoldingStruct ReferenceHoldingStruct{
ReferenceHoldingStruct{prop:input.as_str()}
}
我理解为什么这个版本不起作用:所引用的字符串并不存在于Rust可以看到它将挂起以继续实现结构的
&str
引用的任何地方。我想也许这会奏效:

fn生成\u这些\u 2){
(input,ReferenceHoldingStruct{prop:input.as_str()})
}
因为至少字符串不会立即被删除。我想Rust可能会发现这个元组包含引用和它引用的数据,因此只要它们像这样保持在一起,它们就有效。但没有骰子:这仍然不起作用。它将引用视为借用,将元组移动视为移动,不能“同时”执行这两项操作


所以,我理解这个问题,但不知道该怎么办。这种情况下的标准做法是什么?

您可以存储实现以下功能的内容:

struct ReferenceHoldingStruct{
酒吧道具:S,
}
S
上的绑定允许它是任何可以作为
&str
借用的东西。这可能是一个
&str
本身,也可能是一个拥有的
字符串(或实现
借用的任何其他内容)。由于在
T
&T
上都有实现
借用
的一揽子impl,因此这种方法可用于存储引用或拥有任何类型的值,而不仅仅是
str


下面是一个关于
奶牛的例子(在评论中提到):

使用std::borrow::Cow;
结构引用保持结构
}

fn生成\u这些\u 1 ReferenceHoldingStruct(输入:字符串)->ReferenceHoldingStruct您可以使用吗?我可能错了,但我认为Cow不相关,因为这是一个生命周期的问题,而不是mutability@brundolfCow不仅仅是关于可变性的,它是一种可以保存类型的拥有或引用版本的类型,这正是你要找的。虽然它确实需要将引用转换为所属类型,但strs将开箱即用。您的上一个版本不起作用,因为Rust希望在移动过程中始终可以将值memcpy。其他情况下也有一些Pin类型,但如果没有必要,最好避免使用Pin,因为它会给code.Woah带来复杂性。这真的很酷,可能会奏效。我明天会试试。
借用
很好,但如果您只需要“我借用的字符串或我拥有的字符串”@JMAA您的观点很有道理,您可能会发现您的用例更适合
Cow
<如果使用
str
/
String
Clone
类型,则code>Cow
更容易替换,但与
Cow
不同的是
Borrow
方法适用于非
Clone
类型。
struct ReferenceHoldingStruct<S: Borrow<str>> {
    pub prop: S,
}
use std::borrow::Cow;

struct ReferenceHoldingStruct<'a> {
    pub prop: Cow<'a, str>
}

fn generate_these_1<'a>(input: &'a str) -> ReferenceHoldingStruct<'a> {
    ReferenceHoldingStruct { prop: Cow::Borrowed(input) }
}

fn generate_these_2<'a>(input: String) -> ReferenceHoldingStruct<'a> {
    ReferenceHoldingStruct { prop: Cow::Owned(input) }
}