ToB企服应用市场:ToB评测及商务社交产业平台
标题:
文盘Rust -- struct 中的生命周期
[打印本页]
作者:
王海鱼
时间:
2022-10-8 10:57
标题:
文盘Rust -- struct 中的生命周期
最近在用rust 写一个redis的数据校验工具。
redis-rs
中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程。在开发中,不免要定义struct 中的某些元素为 trait object,从而带来一些rust语言中的生命周期问题。
本文不具体讨论 redis的数据校验过程,通过一个简单的例子来聊聊 struct 中 trait object 元素的生命周期问题。
首先来定义一个 base trait,该 trait 中只包含一个函数,返回String类型。
pub trait Base {
fn say(&self) -> String;
}
复制代码
接下来,定义两个实现了 Base trait 的 struct AFromBase 和 BFromBase
pub struct AFromBase {
content: String,
}
impl Base for AFromBase {
fn say(&self) -> String {
self.content.clone()
}
}
pub struct BFromBase {
text: String,
}
impl Base for BFromBase {
fn say(&self) -> String {
self.text.clone()
}
}
复制代码
接下来,定义一个struct 包含两个 Base trait 的 trait object ,然后实现一个函数是 say 函数输出的字符串的拼接结果.
按照其他没有生命周期语言的编写习惯,直觉上这么写
pub struct AddTowBase {
a: &mut dyn Base,
b: &mut dyn Base,
}
impl AddTowBase {
fn add(&self) -> String {
let result = self.a.say() + &self.b.say();
result
}
}
复制代码
最后,搞个main函数验证一下。
完整代码如下
pub trait Base {
fn say(&self) -> String;
}pub struct AFromBase {
content: String,
}
impl Base for AFromBase {
fn say(&self) -> String {
self.content.clone()
}
}
pub struct BFromBase {
text: String,
}
impl Base for BFromBase {
fn say(&self) -> String {
self.text.clone()
}
}pub struct AddTowBase { a: &mut dyn Base, b: &mut dyn Base,}impl { fn add(&self) -> String { let result = self.a.say() + &self.b.say(); result }}fn main() { let mut a = AFromBase { content: "baseA".to_string(), }; let mut b = BFromBase { text: "baseB".to_string(), }; let addtow = AddTowBase { a: &mut a, b: &mut b, }; let r = addtow.add(); println!("{}", r);}
复制代码
很遗憾,以上代码是不能编译通过的,编译时报如下错误
[code]error[E0106]: missing lifetime specifier --> examples/lifetimeinstruct.rs:26:8 |26 | a: &mut dyn Base, | ^ expected named lifetime parameter |help: consider introducing a named lifetime parameter |25 ~ pub struct AddTowBase examples/lifetimeinstruct.rs:27:8 |27 | b: &mut dyn Base, | ^ expected named lifetime parameter |help: consider introducing a named lifetime parameter |25 ~ pub struct AddTowBase AddTowBase
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4