特征对象的静态数组 [英] static array of trait objects

查看:23
本文介绍了特征对象的静态数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以定义特征对象的静态数组:

Is it possible to define static array of trait objects:

#[macro_use]
extern crate lazy_static;

trait Tr {}

struct A {}
impl Tr for A {}

struct B {}
impl Tr for B {}

lazy_static! {
    static ref ARR: [Box<dyn Tr>;2] = [Box::new(A {}), Box::new(B {})];
    // error[E0277]: `(dyn Tr + 'static)` cannot be shared between threads safely
}

而不是每个 Test 实例有一个 _arr:

Instead of having one _arr per each Test instance:

struct Test {
    arr: [Box<dyn Tr>; 2],
}

impl Default for Test {
    fn default() -> Test {
        Test {
            arr: [Box::new(A {}), Box::new(B {})],
        }
    }
}

推荐答案

你想要Box:

#[macro_use]
extern crate lazy_static;

trait Tr {}

struct A {}
impl Tr for A {}

struct B {}
impl Tr for B {}

lazy_static! {
    static ref ARR: [Box<dyn Tr + Sync>; 2] = [Box::new(A {}), Box::new(B {})];
}

来自Sync:

可以安全地在线程之间共享引用的类型.

Types for which it is safe to share references between threads.

这篇关于特征对象的静态数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆