use std::borrow::Cow;use std::borrow::{ Borrow, ToOwned };use std::ops::Range;#[derive(Clone)]struct A<'a> {// could also be &'a str, but may need to be worked onsource: Cow<'a, str>,// byte indices, that's finefield_a: Range,field_b: Range}impl<'a> A<'a> {fn range(&self, r: &Range) -> &str { &self.source[r.start as usize..r.end as usize] }fn a(&self) -> &str { self.range(&self.field_a) }fn b(&self) -> &str { self.range(&self.field_b) }fn own(self) -> A<'static> {A {source: Cow::Owned((*self.source).into()),field_a: self.field_a.clone(),field_b: self.field_b.clone()}}}fn main() {let s = "Some source string, allocated somewhere else. Probably very long.".to_owned();let a = A { source: Cow::Borrowed(&s), field_a: 5..11, field_b: 20..40 };println!("a: `{}`@{}, b: `{}`@{}", a.a(), a.a().as_ptr() as usize, a.b(), a.b().as_ptr() as usize);let b = a.own();// lost original textdrop(s);// moved around in memoryprintln!("a: `{}`@{}, b: `{}`@{}", b.a(), b.a().as_ptr() as usize, b.b(), b.b().as_ptr() as usize);}