我正在嘗試使用多執行緒模擬和轉換資料,同時留給用戶使用哪種轉換,只要它實作了我的Transformation特征。
我大致理解為什么編譯器不喜歡Transformation在.map()方法中使用 raw,但我想知道在 Rust 中解決這個問題的最佳方法。
我在rayon這里使用,但任何其他建議也將不勝感激。
use rayon::prelude::*;
pub trait Transformation {
fn result(&self, input: &f64) -> f64;
}
pub struct Division {
pub by: f64
}
impl Transformation for Division {
fn result(&self, input: &f64) -> f64 {
input / self.by
}
}
fn simulate_and_transform(paths_num: &usize, trans: &dyn Transformation) -> Vec<f64> {
(0..*paths_num)
.into_par_iter()
.map(|_| trans.result(&rand::random::<f64>()))
.collect()
}
fn main() {
let div = Division {by: 2.0};
let paths = 100;
let sims = simulate_and_transform(&paths, &div);
println!("Samples: {}, {}, {}", sims[3], sims[56], sims[99]);
}
uj5u.com熱心網友回復:
這里只有一個簡單的問題:您不需要Transformation從多個執行緒中安全使用。這是使用trait來表達的Sync。您可以要求該特征的所有實作者使用它:
pub trait Transformation: Sync {
或者您可以在使用時要求它:
fn simulate_and_transform(paths_num: &usize, trans: &(dyn Transformation Sync)) -> Vec<f64> {
這些更改中的任何一個都將允許您的程式編譯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513752.html
標籤:多线程锈人造丝
