Rust 可以将std::rc::rc与trait类型一起使用吗?

Rust 可以将std::rc::rc与trait类型一起使用吗?,rust,Rust,代码如下所示: // Simplified pub trait Field: Send + Sync + Clone { fn name(&self); } #[deriving(Clone)] pub enum Select { SelectOnly(Vec<Rc<Field>>), SelectAll } #[deriving(Clone)] pub enum Select { SelectOnly(Vec<Rc<

代码如下所示:

// Simplified
pub trait Field: Send + Sync + Clone {
    fn name(&self);
}

#[deriving(Clone)]
pub enum Select {
    SelectOnly(Vec<Rc<Field>>),
    SelectAll
}
#[deriving(Clone)]
pub enum Select {
    SelectOnly(Vec<Rc<Box<Field>>>),
    SelectAll
}
有没有其他方法可以将引用向量计数为特征类型的不可变对象

我想我可以像这样重写代码:

// Simplified
pub trait Field: Send + Sync + Clone {
    fn name(&self);
}

#[deriving(Clone)]
pub enum Select {
    SelectOnly(Vec<Rc<Field>>),
    SelectAll
}
#[deriving(Clone)]
pub enum Select {
    SelectOnly(Vec<Rc<Box<Field>>>),
    SelectAll
}
#[派生(克隆)]
发布枚举选择{
仅选择(Vec),
全选
}

这是正确的方法吗?

我相信DST应该是可行的,但生锈还没有出现。DST的主要动机正是希望将trait对象与任何类型的智能指针一起使用。据我所知,这在1.0版本中应该是可能的


实际上,作为一种临时解决方法,您可以使用
Rc
,尽管这种双重间接寻址是不幸的。

在和之后将成为可能。

从1.1开始,可以使用
Rc
创建特征对象。这包括:

use std::rc::Rc;

trait Field: Send + Sync {
    fn name(&self);
}

enum Select {
    Only(Vec<Rc<Field>>),
    All,
}

// ---

struct Example;
impl Field for Example {
    fn name(&self) {}
}

fn main() {
    let fields: Vec<Rc<Field>> = vec![Rc::new(Example)];
    Select::Only(fields);
}
使用std::rc::rc;
特征字段:发送+同步{
fn名称(&self);
}
枚举选择{
仅限(Vec),
全部的
}
// ---
结构实例;
例如,impl字段{
fn名称(&self){}
}
fn main(){
let字段:Vec=Vec![Rc::new(示例)];
选择::仅(字段);
}
请注意,您最初的示例使用了
Clone
,但是您不能将这样一个trait创建为trait对象,因为它是。为了回答这个问题,我把它去掉了


我还删除了枚举变量名称的冗余。

如果将
Rc
替换为
RefCell
,则它不会编译。但是
RefCell
现在采用
T:>大小的
(在其定义中,就像
Rc
)。我遗漏了什么?我想我会自己回答--
RefCell
是一个有效的类型,但也没有大小
RefCell
未实现强制化
rustc 1.20.0-nightly(622e7e648 2017-06-21)错误[E0038]:无法将trait
字段
设置为对象-->:9:16 | 9 | SelectOnly(Rc),| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait
字段
不能成为对象^=注意:trait不能要求
自我调整大小
错误:由于以前的错误而中止@Yash huh想知道它最初是如何工作的。谢天谢地,这是一个与标题中提出的问题正交的问题,所以我删除了这一部分。