Struct 我如何声明我想要一个包含对实现某个特征的东西的引用的结构?

Struct 我如何声明我想要一个包含对实现某个特征的东西的引用的结构?,struct,rust,lifetime,rust-obsolete,Struct,Rust,Lifetime,Rust Obsolete,编者按:问题中给出的代码按照Rust 1.0的编译方式编译 我试过: trait Inner {} struct Outer<'a> { inner: &'a Inner, } 如何告诉Rust我想要一个包含对的引用的结构 实现某种特征的东西 有两种方法。首先,首选的方法是使用泛型: struct Outer<'a, T> { inner: &'a T, } impl<'a, T: Inner> Outer<'a,

编者按:问题中给出的代码按照Rust 1.0的编译方式编译

我试过:

trait Inner {}

struct Outer<'a> {
    inner: &'a Inner,
}
如何告诉Rust我想要一个包含对的引用的结构 实现某种特征的东西

有两种方法。首先,首选的方法是使用泛型:

struct Outer<'a, T> {
    inner: &'a T,
}

impl<'a, T: Inner> Outer<'a, T> {
    // ...
}
这是您已经尝试过的,并且您看到的错误是由于没有指定生存期界限引起的:那是一个
+”东西。您需要指定一个生存期界限,因为trait可以为具有生存期参数的结构(如
Outer
)实现,如果您将这样的结构放入trait对象中,则需要一种在trait对象类型中指定其生存期参数的方法

trait对象的优点是注释数量较少,并且能够使用任意类型作为相同
外部
值的
内部
字段,只要它满足
内部
限制。缺点是您将获得动态调度,这可能会稍微降低效率。如果没有额外的机制,您也无法恢复trait对象的原始类型

如何告诉Rust我想要一个包含对的引用的结构 实现某种特征的东西

有两种方法。首先,首选的方法是使用泛型:

struct Outer<'a, T> {
    inner: &'a T,
}

impl<'a, T: Inner> Outer<'a, T> {
    // ...
}
这是您已经尝试过的,并且您看到的错误是由于没有指定生存期界限引起的:那是一个
+”东西。您需要指定一个生存期界限,因为trait可以为具有生存期参数的结构(如
Outer
)实现,如果您将这样的结构放入trait对象中,则需要一种在trait对象类型中指定其生存期参数的方法


trait对象的优点是注释数量较少,并且能够使用任意类型作为相同
外部
值的
内部
字段,只要它满足
内部
限制。缺点是您将获得动态调度,这可能会稍微降低效率。如果没有额外的机制,您也无法恢复trait对象的原始类型。

这是一个使用生存期说明符的结构示例

我必须创建一个带有字段的结构,该字段是对类型
SWide
的引用。该字段必须是结构内部的引用,因此我向结构添加了一个生存期说明符,并向impl添加了一个生存期说明符,请注意,在impl行中必须两次使用相同的生存期说明符:

extern crate mysql;

use mysql::Pool;
use swide::SWide;

pub struct Context<'a> {
    pub connection_pool: Pool,
    pub cache: Option<&'a SWide>,
}
impl<'a> Context<'a> {
    pub fn new_with_cache(connection_pool: Pool, cache: Option<&'a SWide>) -> Self {
        Context {
            connection_pool: connection_pool,
            cache: cache,
        }
    }
}
extern板条箱mysql;
使用mysql::Pool;
使用swide::swide;
发布结构上下文,
}
恳求{

pub fn new_with_cache(connection_pool:pool,cache:Option这是一个使用生存期说明符的结构示例

我必须创建一个结构,其中的字段引用类型为
SWide
。此字段必须是结构内部的引用,因此我向结构添加了一个生存期说明符,并向impl添加了一个生存期说明符,请注意,在impl行中必须两次使用同一个生存期说明符:

extern crate mysql;

use mysql::Pool;
use swide::SWide;

pub struct Context<'a> {
    pub connection_pool: Pool,
    pub cache: Option<&'a SWide>,
}
impl<'a> Context<'a> {
    pub fn new_with_cache(connection_pool: Pool, cache: Option<&'a SWide>) -> Self {
        Context {
            connection_pool: connection_pool,
            cache: cache,
        }
    }
}
extern板条箱mysql;
使用mysql::Pool;
使用swide::swide;
发布结构上下文,
}
恳求{

pub fn new_与_缓存(连接池:池,缓存:选项这是一个很好的答案。我想要动态分派,所以trait对象解决方案就是我要使用的解决方案。请注意,
struct outer这是一个很好的答案。我想要动态分派,所以trait对象解决方案就是我要使用的解决方案。请注意,
struct outer虽然是有效的锈代码,但这忽略了一个重要的pOP问题的艺术:对实现特征的事物的引用。在我的例子中,SWide是一个结构,而不是一个TraitWhile有效的锈代码,这忽略了OP问题的一个重要部分:对实现特征的事物的引用。在我的例子中,SWide是一个结构,而不是特征