......而V是一种特质。 IE浏览器。这样的东西,但是有效吗?
use std::marker::PhantomData;
pub struct Foo<U, V: ?Sized> where U : V {
instance:Option<U>,
_v: PhantomData<*const V>,
}
impl<U, V> Foo<U, V> {
/// Create a new instance
pub fn new() -> Foo<U, V> {
return Foo {
instance: None,
_v: PhantomData,
};
}
/// Return trait
pub fn as_ref(&self) -> Option<&V> {
return match(self.instance) {
Some(v) => Some(&v as &V),
None => None
};
}
}
#[cfg(test)]
mod test {
use super::Foo;
trait Fooish {
fn x(&self) -> i32;
}
struct Bar;
impl Fooish for Bar {
fn x(&self) -> i32 {
return 0i32;
}
}
#[test]
fn test_new_foo() {
let _ = Foo::<Bar, Fooish>::new();
}
}
围栏链接:http://is.gd/N7tWwH
答案 0 :(得分:2)
不,不幸的是,这是不可能的(可能在未来......)。
问题是只有在U: V
为V
并且无法声明通用参数为trait
时才允许使用语法trait
; ?Sized
仅表示可能不是大小的类型,这允许特征以及其他内容......
当我experimented with polymorphism时,我使用的解决方法是声明特征DerivedFrom
,然后我会检查U: DerivedFrom<V>
。当然,它需要为DerivedFrom<Trait>
实施Struct
......这不完全符合人体工程学......
您可以查看here:
// Scaffolding
pub trait DerivedFrom<T: ?Sized> {}
//
trait SomeTrait {}
struct HelloWorld;
impl SomeTrait for HelloWorld {}
impl DerivedFrom<SomeTrait> for HelloWorld {}
pub struct Foo<U, V: ?Sized> where U: DerivedFrom<V> {
instance: Option<U>,
_v: std::marker::PhantomData<*const V>,
}
type HelloFoo = Foo<HelloWorld, SomeTrait>;
fn main() {
}
注意:当然,出于这个原因,我们无法对DerivedFrom
进行全面的介绍。