...而 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
最佳答案
不,不幸的是这是不可能的(现在,也许在未来......)。
问题是语法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
进行全面实现。 .
关于rust - 是否有可能在 U 和 V 上有一个通用的结构,其中 U : V?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33009214/