如何返回对拥有和活着的东西的引用?

Lar*_*äck 2 rust

如何在以下代码中正确返回set函数中的引用?我确实理解set当块结束时变量超出范围,但它引用的数组是拥有的并且是活动的.一生的尝试'b是徒劳的.

#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
struct Appearance<'a> {
    identity:   &'a u64, 
    role:       &'a str
}

#[derive(Clone, Copy, Debug)]
enum Dereference<'a> {
    Dereference1ary {set: [&'a Appearance<'a>;1]},
    Dereference2ary {set: [&'a Appearance<'a>;2]},
}
impl<'a, 'b> Dereference<'a> {
    fn set(&self) -> &'b [&'a Appearance<'a>] {
        match *self {
            Dereference::Dereference1ary{set} => &set,
            Dereference::Dereference2ary{set} => &set
        }
    }
}

fn main() {
    let r = "hair_color";
    let i1 = 42;
    let i2 = 43;
    let a1 = Appearance{identity: &i1, role: r};
    let a2 = Appearance{identity: &i2, role: r};
    let d1 = Dereference::Dereference1ary{set: [&a1]};
    let d2 = Dereference::Dereference2ary{set: [&a1, &a2]};
    let list: Vec<Dereference> = vec!(d1, d2);
    println!("{:?}", list);
    println!("{:?}", d1.set());
}
Run Code Online (Sandbox Code Playgroud)

这里有一个游乐场:https://play.rust-lang.org/?gist = fd528ebd054a9ce96004c8608166f9ac&version = stable&backtrace = 0

oli*_*obk 5

问题是Derefencece1ary{set}复制set并参考副本.你想要的是set通过使用直接引用该字段Dereference1ary{ ref set }

impl<'a> Dereference<'a> {
    fn set(&self) -> &[&'a Appearance<'a>] {
        match *self {
            Dereference::Dereference1ary{ref set} => set,
            Dereference::Dereference2ary{ref set} => set,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的生命周期'b是多余的,但如果您明确地想要它,您可以写

fn set<'b>(&'b self) -> &'b [&'a Appearance<'a>]
Run Code Online (Sandbox Code Playgroud)

因为你想借用一部分self对象,所以生命周期需要匹配.