最初要写一段从redis的hash获取json字符串,转化为结构体,代码逻辑如下

use redis::{Client, Commands, Connection, Iter};
use serde::{Deserialize, Serialize}; const HASH_KEY: &str = "rust_test_hash_key"; #[derive(Serialize, Deserialize, Debug)]
struct A<'a> {
id: &'a str,
} struct Logic {
redis: Client,
} impl Logic {
fn new() -> Self {
let redis_client =
Client::open("redis://@127.0.0.1:6378/10").unwrap();
Logic {
redis: redis_client,
}
} fn get_redis_conn(&self) -> Connection {
self.redis.get_connection().unwrap()
} fn store_as(&self) {
let mut conn = self.get_redis_conn();
let field = "field_name";
let a = A { id: "id0" };
let value = serde_json::to_string(&a).unwrap();
let _: () = conn.hset(HASH_KEY, field, value).unwrap();
} fn load_as(&self) -> Vec<A> {
let mut conn = self.get_redis_conn();
let results: Iter<(String, String)> = conn.hscan(HASH_KEY).unwrap();
let mut vs = Vec::new();
for (_k, v) in results {
let a: A = serde_json::from_str(&v).unwrap();
vs.push(a);
}
vs
} fn clear_as(&self) {
let mut conn = self.get_redis_conn();
let _: () = conn.del(HASH_KEY).unwrap();
}
} fn main() {
let logic = Logic::new();
logic.store_as();
let a_s = logic.load_as();
println!("a_s is {:?}", a_s);
logic.clear_as();
}

结果运行报错如下

error[E0515]: cannot return value referencing local variable `v`
--> src/main.rs:2051:9
|
2048 | let a: A = serde_json::from_str(&v).unwrap();
| -- `v` is borrowed here
...
2051 | vs
| ^^ returns a value referencing data owned by the current function

很明显是悬垂引用问题

修改后的代码如下

use redis::{Client, Commands, Connection, Iter};
use serde::{Deserialize, Serialize}; const HASH_KEY: &str = "rust_test_hash_key"; #[derive(Serialize, Deserialize, Debug)]
struct A<'a> {
id: &'a str,
} struct Logic {
redis: Client,
} impl Logic {
fn new() -> Self {
let redis_client =
Client::open("redis://@127.0.0.1:6378/10").unwrap();
Logic {
redis: redis_client,
}
} fn get_redis_conn(&self) -> Connection {
self.redis.get_connection().unwrap()
} fn store_as(&self) {
let mut conn = self.get_redis_conn();
let field = "field_name";
let a = A { id: "id0" };
let value = serde_json::to_string(&a).unwrap();
let _: () = conn.hset(HASH_KEY, field, value).unwrap();
} fn load_a_strs(&self) -> Vec<String> {
let mut conn = self.get_redis_conn();
let results: Iter<(String, String)> = conn.hscan(HASH_KEY).unwrap();
let mut vs = Vec::new();
for (_k, v) in results {
vs.push(v);
}
vs
} fn strs_as(a_strs: &Vec<String>) -> Vec<A> {
let mut a_s = Vec::with_capacity(a_strs.len());
for b in a_strs {
let a: A = serde_json::from_str(b).unwrap();
a_s.push(a);
}
a_s
} fn clear_as(&self) {
let mut conn = self.get_redis_conn();
let _: () = conn.del(HASH_KEY).unwrap();
}
} fn main() {
let logic = Logic::new();
logic.store_as();
let b_s = logic.load_a_strs();
let a_s = Logic::strs_as(&b_s);
println!("a_s is {:?}", a_s);
logic.clear_as();
}

记一起rust悬垂引用解决的更多相关文章

  1. 【读书笔记】iOS-ARC-循环引用-解决办法

    一,循环引用最常见的代码类型. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...

  2. Android开发过程中使用弱引用解决内存泄露的习惯

    Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量.缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露. 弱引用(WeakReference)是解决 ...

  3. 错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法

    晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 ...

  4. EntityFramework Model有外键时,Json提示循环引用 解决方法

    正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...

  5. 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法

    ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...

  6. Windows 上安装 Rust 出错及其解决办法

    首先去 https://www.rust-lang.org/tools/install Rust 官网上下载相应的安装包. 直接运行 rustup-init.exe,这一步 会把 rustc, car ...

  7. GCC 高版本7.4 编译链接 boost 报错 boost::thread::XXX’未定义的引用 解决方法

    背景:开发中的项目之前一直用GCC4.8,boost库1.48版本的开发环境.现在因业务需求,需要更换GCC7.4,boost库1.70. 问题:可以正常编译BOOST的链接库文件,但是链接时候报错. ...

  8. truncate表时报“唯一/主键被启用的外部关键字引用”解决办法

    前言:清空表时提示"唯一/主键被启用的外部关键字引用"这一警告信息 原因:是因为主键被子表引用,所以对主键进行更改就好了 解决: 使用 alter table table_name ...

  9. 编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法

    从官网上下载5.3.2的源码后,make linux进行编译,提示报错: gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline ...

  10. 类属性"get"必须声明主体,因为它未标记为 abstract 或 extern[解决方法]

    当在页面cs文件中,写类属性时,运行会碰到以下问题:CS0501: “ASP.default_aspx.Person.Level.get”必须声明主体,因为它未标记为 abstract 或 exter ...

随机推荐

  1. 普冉PY32系列(十一) 基于PY32F002A的6+1通道遥控小车II - 控制篇

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  2. Nginx开启gzip提升访问效率

    说明 最近网站考虑开启gzip压缩试试效果,gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩功能. 通过开启gzip功能,可对服务器响应的数据进行压缩处理 ...

  3. Spring boot项目实战之记录应用访问日志

    1.说明 系统上线后往往我们需要知道都有哪些用户访问了应用的那些功能,以便更好的了解用户需求.防止恶意访问等.为此我们需要给应用添加记录访问日志的功能.下面就开始吧: 2.建表 CREATE TABL ...

  4. spring boot使用自带缓存

    项目地址:https://gitee.com/indexman/spring_boot_in_action 下面就介绍一下如何使用spring boot自带的缓存.按步骤来操作即可,不懂的可以去看项目 ...

  5. Puppeteer介绍

    Puppeteer是什么 Puppeteer是一个Node库,它提供了一个高级API来通过DevTools协议控制Chromium或Chrome. 可以使用Puppeteer来自动化完成浏览器的操作, ...

  6. 临时修改session日期格式冲突问题

    输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter session set NLS_DATE_LANGUAGE ...

  7. MPG线程模型简介

    概述 go语言中的MPG线程模型对两级线程模型进行了一定程度的改进,使它能够更加灵活的进行线程之间的调度. 它由3个主要模块构成,如下图: MPG的3个主要模块以及功能,我们通过下表所示. 模块 功能 ...

  8. day01---操作系统安装环境准备

    虚拟机安装操作系统步骤 1.新建虚拟主机 2.选择自定义 3.稍后安装操作系统 4.操作系统选择linux 5.选择存放位置 6.cpu和核数选择,默认即可 7.内存分配 8.网络选择 9.控制器类型 ...

  9. SpringCloud使用Kafka消费者

    目录 POM文件配置 创建kafka配置 系统配置信息 启动入口 POM文件配置 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  10. 【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常

    Azure Spring Cloud 是什么? 借助 Azure Spring Cloud,可以轻松地将 Spring Boot 微服务应用程序部署到 Azure,不需更改任何代码. 该服务管理 Sp ...