Могу ли я иметь статическую заимствованную ссылку на объект черты?

traits rust

988 просмотра

1 ответ

8757 Репутация автора

Есть ли способ для меня получить статическую заимствованную ссылку на реализацию свойства структуры:

trait Trait {}

struct Example;
impl Trait for Example {}

Это прекрасно работает:

static instance1: Example = Example;

Это также отлично работает:

static instance2: &'static Example = &Example;

Но это не работает:

static instance3: &'static Trait = &Example as &'static Trait;

Это терпит неудачу таким образом:

error[E0277]: the trait bound `Trait + 'static: std::marker::Sync` is not satisfied in `&'static Trait + 'static`
  --> src/main.rs:10:1
   |
10 | static instance3: &'static Trait = &Example as &'static Trait;
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Trait + 'static` cannot be shared between threads safely
   |
   = help: within `&'static Trait + 'static`, the trait `std::marker::Sync` is not implemented for `Trait + 'static`
   = note: required because it appears within the type `&'static Trait + 'static`
   = note: shared static variables must have a type that implements `Sync`

Кроме того, есть ли способ получить заимствованный статический указатель на признак из глобального заимствованного статического указателя на структуру:

static instance2: &'static Example = &Example;

fn f(i: &'static Trait) {
    /* ... */
}

fn main() {
    // how do I invoke f passing in instance2?
}
Автор: LorenVS Источник Размещён: 29.10.2013 07:44

Ответы (1)


4 плюса

171896 Репутация автора

Решение

Да, вы можете, если черта также реализует Sync:

trait Trait: Sync {}

struct Example;
impl Trait for Example {}

static INSTANCE3: &dyn Trait = &Example;

Или, если вы объявите, что ваш объект черты также реализует Sync:

trait Trait {}

struct Example;
impl Trait for Example {}

static INSTANCE3: &(dyn Trait + Sync) = &Example;

Типы, которые реализуют Syncте

[...] для которых безопасно делиться ссылками между потоками.

Эта черта автоматически реализуется, когда компилятор определяет, что это уместно.

Точное определение: тип T, Syncесли &Tесть Send. Другими словами, если нет возможности неопределенного поведения (включая гонки данных) при передаче &Tссылок между потоками.

Поскольку вы делитесь ссылкой, любой поток сможет вызывать методы для этой ссылки, поэтому вам нужно убедиться, что ничто не нарушит правила Rust, если это произойдет.

Автор: Shepmaster Размещён: 22.11.2015 03:09
Вопросы из категории :
32x32