是否可以在U和V上使用结构通用,其中U:V?

时间:2015-10-08 07:23:59

标签: rust

......而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

1 个答案:

答案 0 :(得分:2)

不,不幸的是,这是不可能的(可能在未来......)。

问题是只有在U: VV并且无法声明通用参数为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进行全面的介绍。