返回对trait而不是struct的引用

时间:2015-11-12 02:23:18

标签: rust

我遇到了一个试图在Rust中返回对特征的引用的问题。我可以返回对结构的引用OK。

这是一个重现问题的人为例子,但我将Person结构定义为:

struct PersonStruct<'a> {
    age: u32,
    photo: Option<PhotoStruct<'a>>
}

我也有Person特征,我正在尝试在此特征上编写一个方法来返回Photo特征,而不是PhotoStruct

完整的来源如下,但问题是此方法正常工作:

    fn get_photo_struct(&'a self) -> Option<&'a PhotoStruct<'a>> {
        let photo_ref = self.photo.as_ref();
        photo_ref
    }

...而且这个不会编译......

    fn get_photo_trait(&'a self) -> Option<&'a Photo<'a>> {
        let photo_ref = self.photo.as_ref();
        photo_ref
    }

不同的是,第一个返回结构,第二个返回特征。结构的特征有一个实现。

编译错误是:

src/lib.rs:40:9: 40:18 error: mismatched types:
 expected `core::option::Option<&'a Photo<'a> + 'a>`,
    found `core::option::Option<&PhotoStruct<'_>>`
(expected trait Photo,
    found struct `PhotoStruct`) [E0308]

我很欣赏有关我做错了什么或者我应该采取什么方法的指示。

完整来源:

use std::any::Any;
use std::vec::Vec;

struct PhotoStruct<'a> {
    photo_bytes: &'a [u8]
}

struct PersonStruct<'a> {
    age: u32,
    photo: Option<PhotoStruct<'a>>
}

trait Photo<'a> {
    fn get_bytes(&self) -> &'a[u8];
}

impl<'a> Photo<'a> for PhotoStruct<'a> {
    fn get_bytes(&self) -> &'a[u8] {
        return self.photo_bytes;
    }
}

trait Person<'a> {
    fn get_age(&self) -> u32;
    fn get_photo_struct(&'a self) -> Option<&'a PhotoStruct<'a>>;
    fn get_photo_trait(&'a self) -> Option<&'a Photo<'a>>;
}

impl<'a> Person<'a> for PersonStruct<'a> {
    fn get_age(&self) -> u32 {
        self.age
    }
    fn get_photo_struct(&'a self) -> Option<&'a PhotoStruct<'a>> {
        let photo_ref = self.photo.as_ref();
        photo_ref
    }
    fn get_photo_trait(&'a self) -> Option<&'a Photo<'a>> {
        let photo_ref = self.photo.as_ref();
        photo_ref
    }
}

1 个答案:

答案 0 :(得分:2)

您可以将其投射到&Photo

fn get_photo_trait(&'a self) -> Option<&'a Photo<'a>> {
    let photo_ref = self.photo.as_ref();
    photo_ref.map(|photo| photo as &Photo)
}