如何解决如何定义返回引用内部字段的结构的特征
我正在尝试为算法定义一个特征,该特征在算法的每个步骤后返回一个引用多个内部字段的结构。然后调用代码可以选择序列化状态信息或显示它。我想将它作为引用返回,这样如果调用代码不使用它,就不会影响性能(内部状态可能非常大)。
下面是我认为我想要的,但我希望它是算法特征的通用性,然后为 FooAlgorithm 或其他实现算法特征。
use serde::{Deserialize,Serialize}; // 1.0.125
struct FooStateRef<'a> {
field_0: &'a usize,field_1: &'a usize,}
impl<'a> Clone for FooStateRef<'a> {
fn clone(&self) -> Self {
FooStateRef {
field_0: self.field_0,field_1: self.field_1,}
}
}
impl<'a> copy for FooStateRef<'a> {}
#[derive(Debug,Serialize,Deserialize)]
struct FooState {
field_0: usize,field_1: usize,}
struct FooAlgorithm {
field_0: usize,// Don't want to clone unless the calling code wants to serialize
field_1: usize,// Don't want to clone unless the calling code wants to serialize
field_2: usize,// No need to serialize
}
impl<'a> From<FooStateRef<'a>> for FooState {
fn from(state: FooStateRef) -> FooState {
FooState {
field_0: state.field_0.clone(),field_1: state.field_1.clone(),}
}
}
impl FooAlgorithm {
fn step(&mut self) -> Option<FooStateRef> {
self.field_1 += self.field_0;
self.field_2 += self.field_1;
self.field_0 += self.field_2;
if self.field_2 > 100 {
Some(FooStateRef {
field_0: &self.field_0,field_1: &self.field_1,})
} else {
None
}
}
}
fn main() {
let mut algo = FooAlgorithm {
field_0: 1,field_1: 1,field_2: 1,};
let mut count = 0;
loop {
match algo.step() {
Some(state_ref) => {
if count % 10 == 0 {
// Save state to file
}
}
None => break,}
count += 1;
}
}
我尝试制作算法特征的尝试在这里:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5a36c6eb121f0724284bf7d5ec5a8cad
我遇到的问题是生命周期。如何在算法特征定义中编写函数签名,以便在为 FooAlgorithm 实现 Algorithm 时可以返回 FooStateRef,但在为 Baralgorithm 实现 Algorithm 时也让我返回 BarStateRef?
我研究过的另一件事是关联类型,但据我所知,我需要通用关联特征将 type AlgoStateRef<'a>: StateRef<'a>;
之类的内容添加到算法特征定义中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。