7

有没有办法让我获得对结构的特征实现的静态借用引用:

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`

或者,有没有一种方法可以从全局借用静态指针获取指向 trait 的借用静态指针:

static instance2: &'static Example = &Example;

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

fn main() {
    // how do I invoke f passing in instance2?
}
4

1 回答 1

5

是的,你可以,如果trait 也实现了Sync

trait Trait: Sync {}

struct Example;
impl Trait for Example {}

static INSTANCE3: &dyn Trait = &Example;

或者,如果您声明您的 trait 对象实现了Sync

trait Trait {}

struct Example;
impl Trait for Example {}

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

实现的类型Sync是那些

[...] 在线程之间共享引用是安全的。

当编译器确定它合适时,会自动实现此特征。

准确的定义是:一个类型TSyncif &Tis Send。换句话说,如果&T在线程之间传递引用时不存在未定义行为(包括数据竞争)的可能性。

由于您共享一个引用,因此任何线程都可以调用该引用上的方法,因此您需要确保如果发生这种情况不会违反 Rust 的规则。

于 2015-11-22T15:09:18.730 回答