gpt4 book ai didi

rust - Rust 中的可变Arc

转载 作者:行者123 更新时间:2023-11-29 08:11:28 30 4
gpt4 key购买 nike

之前我有一个 Sync + Send性状 SyncMessenger :

trait Messenger {
fn send_message(&self, user_id: UserId, text: &str);
}

trait SyncMessenger: Messenger + Sync + Send {}

它的实现:

pub struct DiscordMessenger {
discord: Arc<Discord>, // (Discord is Sync and Send already)
}
impl Messenger for DiscordMessenger {
fn send_message(&self, user_id: UserId, text: &str) {
self.discord.send_message(user_id, text, false);
}
}
impl SyncMessenger for DiscordMessenger {}

并使用它:

struct Bot {
messenger: Arc<SyncMessenger>,
}
impl Bot {
pub fn new() -> Bot {
Bot { messenger: Arc::new(DiscordMessenger::new()) }
}

fn messenger(&self) -> Arc<SyncMessenger> {
self.messenger.clone()
}
}

struct PingCommand {
fn fire(&mut self, bot: &mut Bot) {
bot.messenger().send_message(UserId(0), "Pong");
}
}

一切正常。现在我想实现 TestMessenger它实际上并没有通过网络发送消息,而是在 Self 中切换了一个标志。相反:

#[cfg(test)]
struct TestMessenger {
pub message_sent: bool,
}
impl Messenger for TestMessenger {
fn send_message(&mut self, user_id: UserId, text: &str) { // we have `&mut self` here
self.message_sent = true;
}
}

所以我需要改变send_message(&self)send_message(&mut self)无处不在(在特征和实现中)。我这样做了,但是在我无法编译我的用户代码之后:

struct PingCommand {
fn fire(&mut self, bot: &mut Bot) {
bot.messenger().send_message(UserId(0), "Pong");
}
}

给出错误:

   |
12 | let _ = bot.messenger().send_message(UserId(0),
| ^^^^^^^^^^^^^^^ cannot borrow as mutable

error: aborting due to previous error

我找到了一些有用的东西,但对我来说它看起来很丑(并且需要 unwrap(),我想避免):

let _ = Arc::get_mut(&mut bot.messenger()).unwrap().send_message(UserId(0),

所以这里的问题是如何在没有 unwrap() 的情况下尽可能简单地做到这一点s,静态方法,如 Arc::get_mut ?为什么简单fn messenger(&self) -> Arc<SyncMessenger>无法调用 mut方法?

最佳答案

您可以使用内部可变性来更改不可变引用背后的数据。

use std::cell::Cell;
struct TestMessenger {
pub message_sent: Cell<bool>,
}
impl Messenger for TestMessenger {
fn send_message(&self, user_id: UserId, text: &str) {
self.message_sent.set(true);
}
}

此结构适用于单线程情况。您需要 std::sync::Mutex 而不是 Cell 来为 TestMessenger 设置 Sync

关于rust - Rust 中的可变Arc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129606/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com