【发布时间】:2020-12-23 15:44:45
【问题描述】:
我正在用 rust 编写一个命令行应用程序来处理来自传感器的音频。我希望用户能够从多个选项中选择要应用的算法或过滤器。我希望使用动态调度来切换一个在运行时实现我的过滤器特征的结构。但是,编译器不允许这样做,因为其中一个 trait 方法需要一个泛型参数。
我怎样才能实现相同的功能,而不会引起任何编译器问题?我知道一个简单的解决方案是将 process 方法的参数更改为数组或向量,但这是我最后的手段,因为我更喜欢使用迭代器或 IntoIterator,因为它更通用,适合我的具体需求。
这是一些演示问题的代码。
trait SensorFilter {
fn process(&self, sig: &mut impl Iterator<Item = f32>) -> Vec<f32>;
}
struct Alg1 {
mul: f32,
}
struct Alg2 {
add: f32,
}
impl SensorFilter for Alg1 {
fn process(&self, sig: &mut impl Iterator<Item = f32>) -> Vec<f32> {
sig.map(|x| x * self.mul).collect()
}
}
impl SensorFilter for Alg2 {
fn process(&self, sig: &mut impl Iterator<Item = f32>) -> Vec<f32> {
sig.map(|x| x * self.add).collect()
}
}
enum AlgChoice {
Alg1,
Alg2
}
fn main() {
let choice = AlgChoice::Alg1; // user chooses via command-line.
let mut sig = vec![0.,1.,2.,3.,4.,5.,6.].into_iter(); // iterator gets data from sensor.
// This doesn't work, because my trait cannot be made into an object.
let alg: &dyn SensorFilter = match choice {
AlgChoice::Alg1 => Alg1{mul:0.3},
_ => Alg2{add:1.2},
};
let result = alg.process(&mut sig);
println!("{:?}",result);
}
谢谢:)
【问题讨论】:
标签: rust iterator traits dynamic-dispatch