【发布时间】: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插入到您的类型名称中...只需将其命名为Person或Photo。只是一个关于更好风格的小提示...... -
如果我们要评论风格,我建议删除
get_前缀和多余的let语句。
标签: rust