我遇到了一个试图在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
}
}
答案 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)
}