调用哪个返回不同类型的具有共享的性状,并传递给其他函数的函数(Calling functions w

2019-10-30 02:16发布

我仍然相当新的生锈。 我想用一个变量的几个函数返回不同类型的结构之一之间选择,但所有这些都具有相同的特征来实现。 那么我想从所选择的功能将返回的结构来一些功能,这意味着接受其具有特质的任何变量。 然而,我无法弄清楚如何做到这一点。 我读过如何克服不兼容的类型实现同一性状结构相匹配的武器? 但我失去了一些东西,因为我仍然无法得到它的工作。 我将返回的值不接受值的函数 - 见下文。

下面是使用的从上面的链接的方法的一个简化的例子:

trait IsEven {
    fn is_even(&self) -> bool;
}

struct First {
    v: u8,
}

impl IsEven for First {
    fn is_even(&self) -> bool {
        self.v % 2 == 0
    }
}

struct Second {
    v: Vec<u8>,
}

impl IsEven for Second {
    fn is_even(&self) -> bool {
        self.v[0] % 2 == 0
    }
}

fn make1() -> First {
    First{v: 5}
}

fn make2() -> Second {
    Second{v: vec![2, 3, 5]}
}


fn requires_is_even(v: impl IsEven) {
    println!("{:?}", v.is_even());
}

fn main() {
    for i in 0..2 {
        let v1;
        let v2;
        let v = match i {
            0 => {
                v1 = make1();
                &v1 as &IsEven
            }
            _ => {
                v2 = make2();
                &v2 as &IsEven
            }
        };
        requires_is_even(v);  // This is where it fails
    }
}

我在这种情况下得到的错误是:

52 |         requires_is_even(v);
   |         ^^^^^^^^^^^^^^^^ the trait `IsEven` is not implemented for `&dyn IsEven`

我已经使用盒作为一些在上面的链接的其他例子也试过,但仍无法得到它的工作。 任何人都可以帮忙吗?

谢谢

短发

Answer 1:

requires_is_even ,因为你写它,接受它实现的对象IsEven的价值,尽管对该性状的所有方法采取self的共享引用。 然而,尽管如此, &dyn IsEven不会自动实现IsEven (尽管我们可以添加自己的实现,见下文)。

您有几种选择在这里:

  1. 改变功能以接收执行对象IsEven通过共享参考。 (此版本做静态调度)。

     fn requires_is_even(v: &(impl IsEven + ?Sized)) { println!("{:?}", v.is_even()); } 

    注: ?Sized界这里是必要的,因为impl Trait在参数位置是一个类型参数语法糖,和类型参数有一个隐含的Sized界。

  2. 改变为接收功能IsEven通过共享参考性状对象。 (该版本能够动态分配。)

     fn requires_is_even(v: &dyn IsEven) { println!("{:?}", v.is_even()); } 
  3. 实施IsEven任何共享参考对实现一个类型IsEven

     impl<T> IsEven for &T where T: IsEven + ?Sized { fn is_even(&self) -> bool { (**self).is_even() } } 

    注:通过添加?Sized束缚,这impl适用于&dyn IsEven为好。 性状的对象( dyn IsEven这里, &dyn IsEvenBox<dyn IsEven>自动实现它们的对应特征(如果所述性状是对象的安全 ,否则该性状的对象类型是不能使用所有,根据定义)。



文章来源: Calling functions which return different types with shared trait and pass to other functions
标签: rust