我创建了一个包含两个文件和一个枚举的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);
}
}