代码如下所示:
// Simplified
pub trait Field: Send + Sync + Clone {
fn name(&self);
}
#[deriving(Clone)]
pub enum Select {
SelectOnly(Vec<Rc<Field>>),
SelectAll
}
错误是:
the trait `core::kinds::Sized` is not implemented for the type `Field+'static`
有没有其他方法可以使用具有引用计数不可变特征类型对象的向量?
我想我可以像这样重写代码:
#[deriving(Clone)]
pub enum Select {
SelectOnly(Vec<Rc<Box<Field>>>),
SelectAll
}
这是正确的方法吗?
答案 0 :(得分:3)
我相信它应该可以用DST,但Rust还没有。 DST的主要动机正是希望将trait对象与任何类型的智能指针一起使用。据我所知,这应该可以通过1.0发布。
作为临时解决方法,确实可以使用Rc<Box<T>>
,尽管这种双重间接是不幸的。
答案 1 :(得分:3)
It is possible to create an trait object with an x = promoter[promoter['AssociatedGeneName'].str.contains(data['AssociatedGeneName'])]
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
x = promoter[promoter['AssociatedGeneName'].str.contains(data['Associated Gene Name'])]
File "C:\Python34\lib\site-packages\pandas\core\strings.py", line 1226, in contains
na=na, regex=regex)
File "C:\Python34\lib\site-packages\pandas\core\strings.py", line 203, in str_contains
regex = re.compile(pat, flags=flags)
File "C:\Python34\lib\re.py", line 219, in compile
return _compile(pattern, flags)
File "C:\Python34\lib\re.py", line 278, in _compile
return _cache[type(pattern), pattern, flags]
File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 663, in __hash__
' hashed'.format(self.__class__.__name__))
TypeError: 'Series' objects are mutable, thus they cannot be hashed
as of Rust 1.1. This compiles:
Rc
Note that your original example used 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);
}
, but you cannot make such a trait into a trait object because it is not object safe. I've removed it to answer the question.
I also removed the redundancy of the enum variant names.
答案 2 :(得分:1)