rust - 如何避免为 MutexGuard 接口移动可能未初始化的变量?
问题描述
对于以下代码:
let conversation_model =
if lsm { CONVMODEL.lock().await } else {
conv_model_loader()
};
CONVMODEL.lock().await
是MutexGuard<T>
而且conv_model_loader()
只是T
我需要这两个通用接口,所以我不能在两种情况下复制粘贴我的代码,因为它只会与这种类型不同,其他任何东西都是一样的。
编辑:
有代码......(至少我试图做的)
let (locked, loaded); // pun not intended
if lsm {
locked = CONVMODEL.lock().await;
} else {
loaded = conv_model_loader();
};
let mut chat_context = CHAT_CONTEXT.lock().await;
task::spawn_blocking(move || {
let conversation_model = if lsm { &*locked } else { &loaded };
但我失败了,因为
use of possibly-uninitialized variable: `locked`\nuse of possibly-uninitialized `locked`
所以问题实际上是如何MutexGuard
使用接口&T
但在内部使用spawn_blocking
它#[async_recursion]
编辑:
let (mut locked, mut loaded) = (None, None);
if lsm {
locked = Some( CONVMODEL.lock().await );
} else {
loaded = Some( conv_model_loader() );
};
let mut chat_context = CHAT_CONTEXT.lock().await;
task::spawn_blocking(move || {
let (lock, load);
let conversation_model =
if lsm {
lock = locked.unwrap();
&*lock
} else {
load = loaded.unwrap();
&load
};
以下代码正在运行,但实际上非常难看 XD(我想知道是否可以简化此代码)
解决方案
您可以&mut T
从两者中提取并使用它。像下面这样的东西应该可以工作:
let (locked, loaded); // pun not intended
let conversation_model = if lsm {
locked = CONVMODEL.lock().await;
&mut *locked
} else {
loaded = conv_model_loader();
&mut loaded
};
推荐阅读
- php - 从 Woocommerce 中可变产品的变体中获取产品属性标签
- xml - 如何通过abap中的XSLT程序读取XML文件的属性
- javascript - 动态创建的选择不绑定到它们的可观察值?
- c - 从http请求中提取号码
- javascript - 如何在 jQuery 中验证表单?
- spring-boot - Jhipster 网关转发和超时错误
- java - 在 Java 中重构互斥布尔值
- apache-kafka - Kafka SASL_PLAINTEXT 与 GSSAPI for kerberos
- java - 如何使用java在用户系统中打开excel文件
- python - 在 Keras 模型中向 Conv1D 层提供输入时出错