是否可以为结构的类型参数化字段设置默认值?

时间:2017-09-20 18:49:03

标签: rust traits parameterized-types

我有一个特征,可以通过"信号"来获取(音频等)样本。:

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
    • 我还没有找到这样做的组合似乎有效,加上它有点太难以正确。

0 个答案:

没有答案
相关问题