다음 데이터 구조를 고려하십시오.
struct ReferenceHoldingStruct<'a> {
pub prop: &'a str
}
이 패턴은 특히 파서 (내 사용 사례)에서 재할 당하지 않고 일부 문자열 데이터를 구조체에 "제공"하는 데 유용합니다.
fn generate_these_1<'a>(input: &'a str) -> ReferenceHoldingStruct<'a> {
ReferenceHoldingStruct { prop: input }
}
그러나 위와 같은 구조체가있는 경우가 있지만 한 지점에서 "독립적 인"인스턴스를 생성해야합니다. 즉, 자신의 데이터를 소유합니다.
fn generate_these_2<'a>(input: String) -> ReferenceHoldingStruct<'a> {
ReferenceHoldingStruct { prop: input.as_str() }
}
이 버전이 작동하지 않는 이유를 이해합니다. 참조되는 문자열은 Rust가 구조체의 &str
참조 를 계속 수행하기 위해 어슬렁 거리는 것을 볼 수있는 어디에도 존재하지 않습니다 . 나는 이것이 효과가있을 것이라고 생각했다.
fn generate_these_2<'a>(input: String) -> (String, ReferenceHoldingStruct<'a>) {
(input, ReferenceHoldingStruct { prop: input.as_str() })
}
적어도 String은 즉시 삭제되지 않기 때문입니다. 나는 Rust가이 튜플이 참조와 참조하는 데이터를 모두 포함하고 있다는 것을 알아낼 수있을 것이라고 생각했습니다. 따라서 그들이 이렇게 함께 유지되는 한 유효 할 것이라고 생각했습니다. 그러나 주사위는 없습니다. 이것은 여전히 작동하지 않습니다. 참조를 차용으로 취급하고 튜플로의 이동을 이동으로 취급하므로 "동시에"둘 다 수행 할 수 없습니다.
그래서 나는 문제를 이해하지만 여기서 어디로 가야할지 모르겠습니다. 이런 상황에 대한 표준 관행은 무엇입니까?
다음 Cow
은 주석에 언급 된 예입니다 .
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) }
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다