Определение срока службы для справки из потребляемой стоимости

У меня есть код, который в упрощенном виде выглядит так:

enum A<'a> {
    AConst(&'a [u8])
}

trait FromA {
    fn from_a(A) -> Self;
}

impl FromA for &[u8] {
    fn from_a(a: A) -> &[u8] {
        match a {
            AConst(bytes) => bytes
        }
    }
}

fn main() {
    // I'd like to use it like this:
    let s = b"abc";
    let a = AConst(s);
    let foo: &[u8] = from_a(a);
}

Это не работает, поскольку компилятор жалуется на отсутствие спецификаторов времени жизни в &[u8]. Теперь я не уверен, какой будет правильный срок службы. Поскольку from_a потребляет свой аргумент, время жизни возвращенной ссылки явно не может быть таким же, как время жизни аргумента.

Можно ли как-то использовать аннотации времени жизни для этого? Если да, то какие аннотации будут правильными? Можем ли мы каким-то образом заставить тип A нести информацию о времени жизни ссылки?


person fjh    schedule 07.11.2014    source источник


Ответы (1)


Можем ли мы каким-то образом заставить тип A нести информацию о времени жизни ссылки?

Фактически это именно то, что вы делаете, когда пишете

enum A<'a> {                                //'
    AConst(&'a [u8])                        //'
}

Полный тип здесь A<'a>, что означает, что A несет в себе ссылку времени жизни 'a.

Чтобы быть правильным, вам нужно явно распространить это время жизни в вашем определении и реализации признака:

trait FromA<'a> {                           //'
    fn from_a(A<'a>) -> Self;               //'
}

impl<'a> FromA<'a> for &'a [u8] {           //'
    fn from_a(a: A<'a>) -> &'a [u8] {
        match a {
            AConst(bytes) => bytes
        }
    }
}

Таким образом, говорится: время жизни &[u8] среза - это время жизни ссылки, содержащейся в объекте A.

Затем вы можете сделать:

fn main() {
    let s = b"abc";
    let a = AConst(s);
    let foo: &[u8] = FromA::from_a(a);
    println!("{}", foo);
}

[97, 98, 99]
person Levans    schedule 07.11.2014
comment
Отлично спасибо. Я пробовал что-то в этом роде, но, должно быть, пропустил одну из аннотаций, и сообщение об ошибке сбило меня с толку. - person fjh; 07.11.2014