Это надуманный пример, но я верю, что если я смогу получить эту работу, я могу применить его к моему конкретному случаю.Как использовать файл .par_iter() с помощью вектора дженериков?
extern crate num;
extern crate rayon;
use rayon::prelude::*;
use num::Float;
fn sqrts<T: Float>(floats: &Vec<T>) -> Vec<T> {
floats.par_iter().map(|f| f.sqrt()).collect()
}
fn main() {
let v = vec![1.0, 4.0, 9.0, 16.0, 25.0];
println!("{:?}", sqrts(&v));
}
Это ошибки во время компиляции с «метод par_iter
существует, но в следующих пределах признака не были удовлетворены: &std::vec::Vec<T> : rayon::par_iter::IntoParallelIterator
». Код работает нормально, если я использую iter
вместо par_iter
, или если я переключусь на использование f32
или f64
вместо общего.
Что я могу сделать, чтобы использовать par_iter
на вектор дженериков? Является ли признак IntoParallelIterator
конечным пользователем? Как мне это сделать?
Я предполагаю, что это следует за std lib, в котором 'collect' делегирует реализацию' itXerX'' от XXX' ... но здесь нет ничего, что указывало бы мне на поиск «FromParallelIterator» для подсказки, которая помогает исправить проблему. Ну, в любом случае, не в прямом направлении. –
@SimonWhitehead hmm. Я забыл добавить эту часть к моему ответу, но это все еще немного пусто. Сообщение об ошибке указывает «Карта», поскольку не реализует «собирать», но на самом деле это не значит, что «Map» виноват ... – Shepmaster
А, теперь я вижу это с вашими обновлениями. Если бы я не был настолько одержим Рустом, я, конечно, был бы очень смущен ошибкой здесь и, вероятно, сдался. Иногда очень понятно, почему так много людей бросают Rust через короткое время. Спасибо за редактирование, чтобы сделать его немного понятнее! –