rust - 是否有可能在 U 和 V 上有一个通用的结构,其中 U : V?

标签 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

最佳答案

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

问题是语法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/

相关文章:

rust - 解决嵌套可变借用冲突的惯用方法

asynchronous - 如何使用 tokio::join 有条件地运行两个函数之一?

rust - 即使在成功运行 `cargo build` 后编译时也无法找到 crate

rust - 有没有办法在 Option 中拆分变量而不必使用 if 语句?

rust - 如何在 Rust 中将无符号整数转换为整数?

asynchronous - 如何使用rlua-async执行异步lua代码?

scope - 重新绑定(bind)在 for 循环中不起作用的变量

rust - 函数中本地枚举的全局导入

rust - DRY for Rust 条件编译功能

syntax - Some() 在变量赋值的左侧做什么?