// TODO: попробуйте удалить 'move' и посмотреть что получится
children.push(thread::spawn(move || -> u32 {
// Вычислим промежуточную сумму этого сегмента:
let result = data_segment
// итерируемся по символам этого сегмента..
.chars()
// .. преобразуем текстовые символы в их числовые значения..
.map(|c| c.to_digit(10).expect("должно быть числом"))
// .. и суммируем получившийся итератор из чисел
.sum();
// `println!` блокирует стандартный вывод, так что чередования текста не происходит
println!("обработан сегмент {}, result={}", i, result);
// "return" не обязателен, так как Rust "язык выражений" и
// последнее выполненное выращение в каждом блоке автоматически становится значением этого блока.
result
}));
}
/*************************************************************************
* Фаза "Reduce"
*
* Собираем наши промежуточные значения и объединяем их в конечные результат
************************************************************************/
// собираем промежуточный результат каждого потока в новый вектор
let mut intermediate_sums = vec![];
for child in children {
// собираем возвращаемое значение каждого дочернего потока
let intermediate_sum = child.join().unwrap();
intermediate_sums.push(intermediate_sum);
}
// Объединяем все промежуточные суммы в одну конечную сумму.
//
// Мы используем "turbofish" `::<>` чтобы подсказать `sum()` тип.
//
// TODO: попробуйте без turbofish, явно указывая тип final_result
let final_result = intermediate_sums.iter().sum::
println!("Финальная сумма: {}", final_result);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Не стоит позволять числу наших потоков быть зависимом от введённых пользователем данных. Что если пользователь решит вставить много пробелов? Мы
• Потоки
• вектора и итераторы
• замыкания, семантика передачи владения и перемещения (move) в замыканиях
• деструктуризация при присвоениях
• нотация turbofish в помощь механизму вывода типов
• unwrap или expect
Rust предоставляет асинхронные каналы (channel) для взаимодействия между потоками. Каналы обеспечивают однонаправленную передачу информации между двумя конечными точками: отправителем (Sender) и получателем (Receiver).