我有一个特征,可以通过"信号"来获取(音频等)样本。:
pub trait Signal {
/// When requested, all signals must produce a f64 sample.
fn evaluate(&mut self) -> f64;
}
我想为普通的f64
实现这个特性,并让它继续返回相同的值,而不是创建一个完全不同的结构来实现Signal
来做同样的事情:< / p>
impl Signal for f64 {
fn evaluate(&mut self) -> f64 {
*self
}
}
事实证明,无论如何这并不重要;即使我创建了所述结构,当我尝试给出一个默认值时,它也无法正常工作。
在我的一个信号发生器中,我想切换使用f64
类型:
// Sine implements Signal
pub struct Sine {
frequency: f64,
// Other fields omitted
}
要Signal
类型,才能让频率随时间变化:
pub struct Sine<F> where
F: Signal,
{
frequency: F,
// Other fields omitted
}
当我去创建一个试图默认参数化类型的Sine::new()
函数时出现问题(注意我需要使用参数化类型来捕获特征类型而不是因为{{3}而使用引用}):
impl<F> Sine<F> where
F: Signal,
{
/// Creates a new Sine wave signal generator.
pub fn new() -> Sine<F> {
Sine {
frequency: 444.0,
// Other fields omitted
}
}
}
我收到以下错误:
error[E0308]: mismatched types
--> src/dsp/generators/sine.rs:35:24
|
35 | frequency: 444.0,
| ^^^^^ expected type parameter, found floating-point variable
|
= note: expected type `F`
found type `{float}`
只要我有new()
您明确传入实现Signal
的类型,这个相同的结构定义就可以正常工作:
let sine_gen1 = generators::Sine::new(440.0);
但我希望能够默认值而不是一直传递所有参数。
我尝试过的其他一些事情:
444.0 as F
error[E0605]: non-primitive cast: 'f64' as 'F' (error[E0605]: non-primitive cast: 'f64' as 'F')
440.0_f64 as Signal
error[E0620]: cast to unsized type: 'f64' as 'dsp::traits::Signal'
Constant
),在其自己的f64
函数中接受new()
并实现Signal
,然后在Sine::new()
中创建该结构的实例{1}}并尝试将其设置为frequency