gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:00:38 25 4
gpt4 key购买 nike

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

25 4 0