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想知道它最初是如何工作的。谢天谢地,这是一个与标题中提出的问题正交的问题,所以我删除了这一部分。