itertools & rand
itertools estende o ecossistema de iteradores com combinadores que o std não possui. rand fornece aleatoriedade reproduzível e testável para simulações, amostragem e IDs.
Receita
itertools = "0.14"
rand = "0.9"use itertools::Itertools;
fn main() {
let v = vec![1, 2, 3, 4];
let pairs: Vec<_> = v.iter().tuple_windows().collect();
assert_eq!(pairs, vec![(&1, &2), (&2, &3), (&3, &4)]);
}use rand::Rng;
fn sample_id() -> u64 {
rand::rng().random_range(1_000_000..9_999_999)
}Quando usar isso:
- Agrupamento, particionamento e produtos cartesianos em ETL
- Embaralhamento de fixtures de teste
- Lógica de jogos, Monte Carlo, dados de teste de carga
Exemplo de Trabalho
use itertools::iproduct;
use rand::seq::SliceRandom;
fn all_pairs(ids: &[u32]) -> Vec<(u32, u32)> {
iproduct!(ids.iter(), ids.iter())
.map(|(&a, &b)| (a, b))
.filter(|(a, b)| a < b)
.collect()
}
fn shuffled(mut items: Vec<&str>) -> Vec<&str> {
items.shuffle(&mut rand::rng());
items
}O que isso demonstra:
iproduct!substitui loops aninhadostuple_windowspara visualizações deslizantesSliceRandompara embaralhamentos imparciais
Mergulho Profundo
Destaques do itertools
| Adaptador | Uso |
|---|---|
group_by | Agrupamento estilo run-length |
chunks / batch | Lotes de tamanho fixo |
unique | Deduplicação no pipeline do iterador |
collect_vec | Coleta ergonômica (trait de extensão) |
RNG Reproduzível
use rand::SeedableRng;
use rand::rngs::StdRng;
let mut rng = StdRng::seed_from_u64(42);
let n: u32 = rng.random_range(0..100);Semente em testes para saída determinística.
Armadilhas
- rand em contextos de segurança -
thread_rngnão é criptográfico. Correção:rand_core+ringou RNG do sistema operacional para tokens. - Coletando iteradores infinitos - trava. Correção:
take(n)antes decollect. - itertools em APIs públicas - acopla consumidores ao crate. Correção: retorne
Vecouimpl Iteratorsempre que possível. - Viés em
random_range- use intervalos da biblioteca, não%em inteiros. - Grandes produtos cartesianos - explosão de memória. Correção: transmita com
for_eachem vez decollect.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Loops manuais | Lógica pequena | Pipelines combinatórios |
Crate uuid | IDs únicos | Amostragem estatística |
nanoid | IDs seguros para URL | RNG científico |
FAQs
rand 0.8 vs 0.9?
Novos projetos usam a API 0.9 (ponto de entrada rng()). Alinhe o workspace em uma versão.
Iteradores paralelos?
Use rayon para coleta paralela; itertools permanece sequencial.
Embaralhar para testes de carga?
Embaralhe os IDs de entrada, depois take(n) para amostras representativas.
itertools aloca?
A maioria dos adaptadores são preguiçosos; collect aloca o contêiner de resultado.
Relacionado
- Adaptadores de iterador
- rayon - coleta paralela
- Noções básicas de coleções
- Melhores práticas de crates essenciais
Versões da pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.