使用RustFFT时遭遇‘type annotations required’错误求助
解决RustFFT中类型注解缺失的error[E0283]问题
嘿,咱们来搞定这个RustFFT里的类型错误!先看看你贴的代码:
extern crate num; extern crate rustfft; use rustfft::num_complex::Complex; use rustfft::num_traits::Zero; pub fn ct_fft(input: &Vec<f64>, sampling: u32) { let data_size = input.len(); let mut input_array: Vec<Complex<f64>> = Vec::with_capacity(data_size); let fft = rustfft::FFTplanner::new(false).plan_fft(data_size as usize); for v in input { input_array.push(Complex { re: *v, im: 0.0 }); } }
你遇到的错误是:
error[E0283]: type annotations required
问题原因
这个错误出在FFTplanner::new(false).plan_fft(...)这一行。FFTplanner是个泛型结构体,它能生成多种不同类型的FFT算法实现,但Rust的类型推断在这里没法自动判断你需要的是哪一种——毕竟你处理的是Complex<f64>,但编译器没法从上下文直接关联到FFTplanner的泛型参数。
两种解决方法
方法一:给fft变量加类型注解
先导入rustfft::FFT trait,然后给fft指定明确的类型:
extern crate num; extern crate rustfft; use rustfft::num_complex::Complex; use rustfft::num_traits::Zero; use rustfft::FFT; // 新增:导入FFT trait pub fn ct_fft(input: &Vec<f64>, sampling: u32) { let data_size = input.len(); let mut input_array: Vec<Complex<f64>> = Vec::with_capacity(data_size); // 给fft加上类型注解,明确是处理f64复数的FFT实现 let fft: Box<dyn FFT<f64>> = rustfft::FFTplanner::new(false).plan_fft(data_size); for v in input { input_array.push(Complex { re: *v, im: 0.0 }); } // 额外提一句:你之后大概率需要执行FFT,比如这样: // let mut output = vec![Complex::zero(); data_size]; // fft.process(&mut input_array, &mut output); }
方法二:直接给FFTplanner指定泛型参数
这种方式更简洁,直接告诉FFTplanner我们要处理的是f64类型:
extern crate num; extern crate rustfft; use rustfft::num_complex::Complex; use rustfft::num_traits::Zero; pub fn ct_fft(input: &Vec<f64>, sampling: u32) { let data_size = input.len(); let mut input_array: Vec<Complex<f64>> = Vec::with_capacity(data_size); // 显式指定FFTplanner的泛型参数为f64 let fft = rustfft::FFTplanner::<f64>::new(false).plan_fft(data_size); for v in input { input_array.push(Complex { re: *v, im: 0.0 }); } }
总结
本质就是帮Rust编译器一把,通过显式的类型信息(要么给变量加注解,要么给泛型结构体指定参数),让它知道你需要的FFT实现具体是什么类型,这样就能顺利通过编译啦。
内容的提问来源于stack exchange,提问作者Kazik
相关产品推荐
相关产品推荐

