Как поставить явное время жизни на себя для связанной константы? - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть черта, с которой я хочу иметь связанную константу, где константа будет срезом типа, который реализует черту. Примерно так:

trait A: Sized {
    const VALUES: &'static [Self];
}

#[derive(Debug)]
struct B {
    b: u8,
}

impl A for B {
    const VALUES: &'static [B] = &[B { b: 1 }];
}

#[derive(Debug)]
struct C {
    c: usize,
}

impl A for C {
    const VALUES: &'static [C] = &[C { c: 4 }];
}

fn main() {
    println!("{:?}", B::VALUES);
    println!("{:?}", C::VALUES);
}

Это не скомпилируется с ошибкой:

error[E0310]: the parameter type `Self` may not live long enough
 --> src/main.rs:2:5
  |
2 |     const VALUES: &'static [Self];
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: consider adding an explicit lifetime bound `Self: 'static`...
note: ...so that the reference type `&'static [Self]` does not outlive the data it points at

Как эта граница времени жизни выражается для связанной константы? Если это уместно, я использую последнюю rustc стабильную (1.42.0) и версию 2018 года.

1 Ответ

1 голос
/ 20 апреля 2020

В большинстве случаев вы, вероятно, захотите просто добавить 'static к супертрейту, связанному с A:

trait A: Sized + 'static {
    const VALUES: &'static [Self];
}

Вместо этого вы можете поставить Self: 'static, привязанное только к VALUES:

trait A: Sized {
    const VALUES: &'static [Self] where Self: 'static;
}

Это означает, что вы все еще можете реализовать A для не-1012 * типов, но такие типы не будут иметь VALUES связанную константу, так что это практично, если эта черта A обладает некоторым другим полезным свойством, независимым от VALUES. (Кроме того, чтобы использовать T::VALUES в общем коде c, вы должны связать T: A + 'static вместо простого T: A.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...