克隆具有推断 (?) 类型的 std::iter::Map
Cloning a std::iter::Map with inferred (?) type
我在以紧凑方式克隆地图时遇到问题:
extern crate itertools_num;
use itertools_num::linspace;
fn main() {
// 440Hz as wave frequency (middle A)
let freq: f64 = 440.0;
// Time vector sampled at 880 times/s (~Nyquist), over 1s
let delta: f64 = 1.0 / freq / 2.0;
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let sine_440: Vec<f64> = time_1s.map(|time_sample| {
(freq * time_sample).sin()
}).collect();
let sine_100: Vec<f64> = time_1s.map(|time_sample| {
(100.0 * time_sample).sin()
}).collect();
}
我使用此代码得到的错误是
`time_1s` moved here because it has type `std::iter::Map<itertools_num::Linspace<f64>, [closure@examples/linear_dft.rs:12:14: 12:40 delta:&f64]>`, which is non-copyable
这是可以理解的,但如果我尝试使用 time_1s.clone()
,我会得到
note: the method `clone` exists but the following trait bounds were not satisfied: `[closure@examples/linear_dft.rs:12:14: 12:40 delta:_] : std::clone::Clone`
error: the type of this value must be known in this context
(freq * time_sample).sin()
这也是可以理解的,但是在返回之前将 (freq * time_sample).sin()
存储在闭包内的 let foo: f64
中没有任何效果。
遇到这种情况我该怎么办?我只想多次使用时间向量。
我原来的回答导致了迭代器的3次枚举。理想情况下,您正在寻找 2 次迭代。
由于 map
使用迭代器,似乎更简单、更有效的方法是只自己循环一次而不导致不必要的迭代或克隆:
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let mut sine_100 = Vec::new();
let mut sine_440 = Vec::new();
for time_sample in time_1s {
sine_100.push((100.0 * time_sample).sin());
sine_440.push((freq * time_sample).sin());
}
println!("{:?}", sine_100);
println!("{:?}", sine_440);
使用 time_1s
两次的一种方法是同时使用并在最后解压缩:
extern crate itertools_num;
use itertools_num::linspace;
fn main() {
// 440Hz as wave frequency (middle A)
let freq: f64 = 440.0;
// Time vector sampled at 880 times/s (~Nyquist), over 1s
let delta: f64 = 1.0 / freq / 2.0;
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let (sine_440, sine_100): (Vec<f64>, Vec<f64>) = time_1s.map(|time_sample| {
((freq * time_sample).sin(),
(100.0 * time_sample).sin())
}).unzip();
}
我在以紧凑方式克隆地图时遇到问题:
extern crate itertools_num;
use itertools_num::linspace;
fn main() {
// 440Hz as wave frequency (middle A)
let freq: f64 = 440.0;
// Time vector sampled at 880 times/s (~Nyquist), over 1s
let delta: f64 = 1.0 / freq / 2.0;
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let sine_440: Vec<f64> = time_1s.map(|time_sample| {
(freq * time_sample).sin()
}).collect();
let sine_100: Vec<f64> = time_1s.map(|time_sample| {
(100.0 * time_sample).sin()
}).collect();
}
我使用此代码得到的错误是
`time_1s` moved here because it has type `std::iter::Map<itertools_num::Linspace<f64>, [closure@examples/linear_dft.rs:12:14: 12:40 delta:&f64]>`, which is non-copyable
这是可以理解的,但如果我尝试使用 time_1s.clone()
,我会得到
note: the method `clone` exists but the following trait bounds were not satisfied: `[closure@examples/linear_dft.rs:12:14: 12:40 delta:_] : std::clone::Clone`
error: the type of this value must be known in this context
(freq * time_sample).sin()
这也是可以理解的,但是在返回之前将 (freq * time_sample).sin()
存储在闭包内的 let foo: f64
中没有任何效果。
遇到这种情况我该怎么办?我只想多次使用时间向量。
我原来的回答导致了迭代器的3次枚举。理想情况下,您正在寻找 2 次迭代。
由于 map
使用迭代器,似乎更简单、更有效的方法是只自己循环一次而不导致不必要的迭代或克隆:
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let mut sine_100 = Vec::new();
let mut sine_440 = Vec::new();
for time_sample in time_1s {
sine_100.push((100.0 * time_sample).sin());
sine_440.push((freq * time_sample).sin());
}
println!("{:?}", sine_100);
println!("{:?}", sine_440);
使用 time_1s
两次的一种方法是同时使用并在最后解压缩:
extern crate itertools_num;
use itertools_num::linspace;
fn main() {
// 440Hz as wave frequency (middle A)
let freq: f64 = 440.0;
// Time vector sampled at 880 times/s (~Nyquist), over 1s
let delta: f64 = 1.0 / freq / 2.0;
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});
let (sine_440, sine_100): (Vec<f64>, Vec<f64>) = time_1s.map(|time_sample| {
((freq * time_sample).sin(),
(100.0 * time_sample).sin())
}).unzip();
}