我创建了一个包含两个文件和一个枚举的Task struct .对于这个 struct ,我想实现一个方法来读取输入文件并将其解码为wav(音频).为此,我使用了wav crate .该方法应该返回一个Header和一个Vec<f32>,前者保存文件的一些元数据,后者是音频数据本身.

问题是我只有办法获得对该音频向量(as_thirty_two_float())的引用.此引用由第一行中创建的read对象所有.我不被允许退还引用,因为read很快就会被处理掉.我也不被允许返回内容(*data_vector),因为"不能移出位于共享引用后面的*data_vector:发生移动是因为*data_vector具有类型Vec<f32>,该类型不实现Copy特征".

显然,我可以只克隆载体,然后完成它,但我想相信,有一种方法可以通过在这个过程中摧毁read来获得*data_vector的所有权.有人能帮我解释一下这件事吗?

struct Task {
    input_file: File,
    output_file: File,
    effect: Effect,
}

impl Task {
    fn decode_input(&mut self) -> (Header, Vec<f32>) {
        let read = wav::read(&mut self.input_file)
            .expect("Failed to decode the input file");
        let data_vector = read.1.as_thirty_two_float() // &Vec<f32>
            .expect("Failed to extract the audio channel data");
        return (read.0, *data_vector);
    }
}

推荐答案

您可以使用try_into_thirty_two_float(),在成功时将向量移出BitDepth,或者在失败时返回BitDepth不变.

let (header, bitdepth) = wav::read(&mut self.input_file)
    .expect("Failed to decode the input file");
let data_vector = bitdepth.try_into_thirty_two_float()
    .expect("Failed to extract the audio channel data");
(header, data_vector)

Rust相关问答推荐

阻止websocket中断的中断中断的终端(操作系统错误4)

常量泛型和类型枚举箱有重叠的用途吗?

如何指定不同的类型来常量Rust中的泛型参数?

默认特征实现中的生命周期问题

无符号整数的Rust带符号差

如何创建一个可变的嵌套迭代器?

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

如何在 Rust 中打印 let-else 语句中的错误?

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

没有明确地说return会产生错误:match arms have incompatible types

如何将 Rust 字符串转换为 i8(c_char) 数组?

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

是否可以预测堆栈溢出?

为什么在 rust 中删除 vec 之前应该删除元素

如何解析 Rust 中的 yaml 条件字段?

在 Rust 中有条件地导入?

为什么这个 Trait 无效?以及改用什么签名?

当引用不再被borrow 时,Rust 不会得到它

为什么可以从不可变 struct 的字段中移动?