记一起rust悬垂引用解决
最初要写一段从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悬垂引用解决的更多相关文章
- 【读书笔记】iOS-ARC-循环引用-解决办法
一,循环引用最常见的代码类型. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...
- Android开发过程中使用弱引用解决内存泄露的习惯
Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量.缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露. 弱引用(WeakReference)是解决 ...
- 错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法
晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 ...
- EntityFramework Model有外键时,Json提示循环引用 解决方法
正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...
- 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法
ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...
- Windows 上安装 Rust 出错及其解决办法
首先去 https://www.rust-lang.org/tools/install Rust 官网上下载相应的安装包. 直接运行 rustup-init.exe,这一步 会把 rustc, car ...
- GCC 高版本7.4 编译链接 boost 报错 boost::thread::XXX’未定义的引用 解决方法
背景:开发中的项目之前一直用GCC4.8,boost库1.48版本的开发环境.现在因业务需求,需要更换GCC7.4,boost库1.70. 问题:可以正常编译BOOST的链接库文件,但是链接时候报错. ...
- truncate表时报“唯一/主键被启用的外部关键字引用”解决办法
前言:清空表时提示"唯一/主键被启用的外部关键字引用"这一警告信息 原因:是因为主键被子表引用,所以对主键进行更改就好了 解决: 使用 alter table table_name ...
- 编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法
从官网上下载5.3.2的源码后,make linux进行编译,提示报错: gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline ...
- 类属性"get"必须声明主体,因为它未标记为 abstract 或 extern[解决方法]
当在页面cs文件中,写类属性时,运行会碰到以下问题:CS0501: “ASP.default_aspx.Person.Level.get”必须声明主体,因为它未标记为 abstract 或 exter ...
随机推荐
- NC19975 [HAOI2008]移动玩具
题目链接 题目 题目描述 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移 ...
- SVG与foreignObject元素
SVG与foreignObject元素 可缩放矢量图形Scalable Vector Graphics - SVG基于XML标记语言,用于描述二维的矢量图形.作为一个基于文本的开放网络标准,SVG能够 ...
- Go语言的100个错误使用场景(48-54)|错误管理
目录 前言 7. 错误管理 7.1 panicking(#48) 7.2 不清楚何时应该包裹一个 error(#49) 7.3 检查错误类型不够精确(#50) 7.4 检查错误值不够精确(#51) 7 ...
- MySQL的MVCC概念介绍(转)
并发字段修改业务 最近在主要在做"工作流引擎"课题的预研工作,在涉及到"会签任务"(工作流业务概念,这与我们今天讨论文问题没有太多关联)的时候,遇到了一个并发修 ...
- Oracle 10gR2新SQL提示——opt_param
[English] 搜索Internet 搜索 HelloDBABA 首页 English 中文 技术文档 文章 案例 产品及下载 产品 >> FyDB OraTracer FySafe ...
- 《深入理解Java虚拟机》(三)类加载机制
@ 目录 1.什么是类的加载 2.类加载的过程 加载 连接 验证 文件格式验证 元数据验证 字节码验证 符号引用验证 准备 解析: 类或接口的解析 字段解析 类方法解析 接口方法解析 初始化 结束生命 ...
- 【Android逆向】反调试绕过
1. 拿到52pojie的反调试挑战apk 链接: https://www.52pojie.cn/thread-742686-1-1.html 的附件中 2. 项目进行安装,点开app,同时挑战成功, ...
- Centos8上安装Redis5.X
一.下载Redis 下载地址:wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压:tar -xzvf redis-5.0.7.ta ...
- KVM整理
管理命令: virsh list --all 查看所有虚拟机状态 virsh start vm1 VM1开机 virsh shutdown vm1 VM1关机 virsh destroy vm1 强制 ...
- 微软应用商店错误代码“0x80131500”怎么修复?
处理方法一 打开"运行"输入 inetcpl.cpl ("WINDOWS"+"R"键,输入 inetcpl.cpl亦可),点开高级往下拉,勾 ...