Rust에서 때때로 참조 데이터를 소유하기 위해 참조 보유 구조체가 필요할 때의 패턴은 무엇입니까?

Brundolf

다음 데이터 구조를 고려하십시오.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관