Struct 我如何声明我想要一个包含对实现某个特征的东西的引用的结构?
编者按:问题中给出的代码按照Rust 1.0的编译方式编译 我试过: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,
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是一个结构,而不是特征