【问题标题】:Returning reference to trait rather than struct返回对特征而不是结构的引用
【发布时间】:2015-11-12 02:23:18
【问题描述】:

我在尝试返回对 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
    }
}

【问题讨论】:

  • 附注:您通常不应该将Struct 插入到您的类型名称中...只需将其命名为PersonPhoto。只是一个关于更好风格的小提示......
  • 如果我们要评论风格,我建议删除 get_ 前缀和多余的 let 语句。

标签: rust


【解决方案1】:

您可以将其转换为 &amp;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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多