文盘Rust -- struct 中的生命周期

打印 上一主题 下一主题

主题 645|帖子 645|积分 1935

最近在用rust 写一个redis的数据校验工具。redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程。在开发中,不免要定义struct 中的某些元素为 trait object,从而带来一些rust语言中的生命周期问题。
本文不具体讨论 redis的数据校验过程,通过一个简单的例子来聊聊 struct 中 trait object 元素的生命周期问题。
首先来定义一个 base trait,该 trait 中只包含一个函数,返回String类型。
  1. pub trait Base {
  2.     fn say(&self) -> String;
  3. }
复制代码
接下来,定义两个实现了 Base trait 的 struct AFromBase 和 BFromBase
  1. pub struct AFromBase {
  2.     content: String,
  3. }
  4. impl Base for AFromBase {
  5.     fn say(&self) -> String {
  6.         self.content.clone()
  7.     }
  8. }
  9. pub struct BFromBase {
  10.     text: String,
  11. }
  12. impl Base for BFromBase {
  13.     fn say(&self) -> String {
  14.         self.text.clone()
  15.     }
  16. }
复制代码
接下来,定义一个struct 包含两个 Base trait 的 trait object ,然后实现一个函数是 say 函数输出的字符串的拼接结果.
按照其他没有生命周期语言的编写习惯,直觉上这么写
  1. pub struct AddTowBase {
  2.     a: &mut dyn Base,
  3.     b: &mut dyn Base,
  4. }
  5. impl AddTowBase {
  6.     fn add(&self) -> String {
  7.         let result = self.a.say() + &self.b.say();
  8.         result
  9.     }
  10. }
复制代码
最后,搞个main函数验证一下。
完整代码如下
  1. pub trait Base {
  2.     fn say(&self) -> String;
  3. }pub struct AFromBase {
  4.     content: String,
  5. }
  6. impl Base for AFromBase {
  7.     fn say(&self) -> String {
  8.         self.content.clone()
  9.     }
  10. }
  11. pub struct BFromBase {
  12.     text: String,
  13. }
  14. impl Base for BFromBase {
  15.     fn say(&self) -> String {
  16.         self.text.clone()
  17.     }
  18. }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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表