gpt4 book ai didi

rust - 将切片从静态回调转发到 channel 时存在冲突的生命周期要求

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

我正在使用 Rust Midi library接收和处理实时 Midi 消息。它公开了一个 connect 函数,该函数接受一个回调函数,每个到达的 Midi 消息都会调用该回调函数。我的计划是将这些 Midi 消息转发到一个 channel 。这是仍然重现我的问题的代码的最小版本 (Rust Playground link):

use std::sync::mpsc;

fn main() {
let (tx, rx) = mpsc::sync_channel(0);

// The callback forwards all data it gets to the channel
connect(|data| tx.send(data).unwrap());

// `rx` will be given to some other part of the program here
}

// This is basically the function signature of my Midi library's `connect` function
// I *don't have control over it*, as it's part of that external library
fn connect<F>(callback: F)
where F: FnMut(&[u8]) + Send + 'static {}

在研究了一段时间之后,我认为解决方案是在回调中添加move 关键字。这对我来说很有意义,因为回调可能比主函数存在的时间更长,所以当回调仍然需要它时 tx 可能已经被丢弃了。 move 强制回调通过值捕获其环境,这应该导致 tx 与回调一样长。
然而 move 没有任何改变;错误消息保持不变。

我注意到,当我将回调的参数从 &[u8] 更改为仅 u8 时,move 实际上起到了作用。我不知道为什么会这样。

Another question I've found解释了如何通过 channel 发送可变切片,但我有不可变切片,所以我认为有比那里解释的更简单的解决方案。

要关闭它:我知道可以重构代码以避免 channel 。但是,我仍然对解决方案感兴趣,因此我可以自己解决 future 的 channel 和回调问题。

最佳答案

它在我的大脑中发出咔哒声。

此外,对于 move 关键字,以下是必需的:

connect 提供对回调范围内数组的引用。这意味着当回调完成时,&[u8] 是不可访问的。我尝试在回调之外发送引用,这没有任何意义,因为那样它就必须活得更久。

解决方案是从切片创建一个拥有的对象,如 Vec。这可以通过添加 .to_vec() 简单地完成:

connect(move |data| tx.send(data.to_vec()).unwrap());

Vec 可以在没有任何生命周期冲突的情况下自由传递。 :)

关于rust - 将切片从静态回调转发到 channel 时存在冲突的生命周期要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685763/

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