Introdução: vetores são simples, até você precisar juntá-los
\nImagine: você está escrevendo um programa em Rust que processa dados. Você obtém dois Vec<i32> e quer combiná-los em um. Parece simples, certo? Mas qualquer um que já fez essa pergunta no Stack Overflow (e são milhares!) sabe: no Rust existem pelo menos 5 maneiras de fazer isso, e metade delas são erros que ou não compilam ou consomem todo o desempenho.
Neste artigo, vamos analisar a pergunta popular «What is the best way to concatenate vectors in Rust?» e transformá-la em um guia prático. Você aprenderá como concatenar vetores corretamente, quais armadilhas esperam os iniciantes e como escrever código eficiente em Rust. Vamos lá!
\n\nPor que a concatenação de vetores em Rust não é uma tarefa tão trivial?
\nAo contrário do Python ou JavaScript, onde você pode simplesmente escrever list1 + list2, o Rust exige que você especifique explicitamente o que deseja fazer com a memória. Um vetor em Rust não é apenas uma lista, mas uma estrutura que possui dados no heap. Operações com ele podem levar a:
- \n
- Realocações (cópia de todo o buffer). \n
- Perda de propriedade (semântica de movimentação). \n
- Clonagens desnecessárias (se os dados forem grandes). \n
Portanto, a escolha do método depende do contexto: você precisa manter os vetores originais, qual o tipo de dado interno, a velocidade é importante.
\n\nTop 5 erros ao concatenar vetores em Rust
\nVamos passar pelos erros mais comuns que iniciantes (e não só) cometem.
\n\nErro nº1: Usar + para Vec (não compila)
\nA tentativa mais intuitiva, mas incorreta:
\nlet v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet v3 = v1 + v2; // Erro! cannot add `Vec<{integer}>` to `Vec<{integer}>`\nO operador + é sobrecarregado apenas para strings e números, não para vetores. Rust não permite somar coleções diretamente.
Erro nº2: Esquecer da movimentação e perder dados
\nMuitos usam append e se surpreendem que o primeiro vetor ficou vazio:
let mut v1 = vec![1, 2, 3];\nlet mut v2 = vec![4, 5, 6];\nv1.append(&mut v2);\nprintln!("{:?}", v2); // Vazio! v2 agora está vazio.\nappend move os elementos do segundo vetor para o primeiro, deixando v2 vazio. Isso é eficiente, mas nem sempre esperado.
Erro nº3: Clonagem ingênua de tudo
\nQuando é necessário manter ambos os vetores originais, iniciantes frequentemente escrevem:
\nlet v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet mut v3 = v1.clone();\nv3.extend(v2.clone()); // Duas clonagens!\nPara vetores grandes com String ou estruturas complexas, isso prejudica o desempenho. É melhor usar referências ou chain.
Erro nº4: Ignorar capacity ao usar extend
\nUm simples extend pode causar múltiplas realocações:
let mut v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nv1.extend(v2); // Se a capacidade de v1 for pequena, haverá realocação.\nSe você sabe o tamanho final, é melhor alocar memória antecipadamente: v1.reserve(v2.len()).
Erro nº5: Confundir extend e append
\nextend aceita um iterador e pode clonar elementos (se você passar &vec). append move elementos sem clonagem. A escolha não é óbvia até você ler a documentação.
Melhores maneiras de concatenar vetores em Rust (com exemplos)
\nAgora que conhecemos o inimigo, vamos analisar as abordagens corretas. Cada uma é boa para seu cenário.
\n\nMétodo 1: extend — universal e compreensível
\nO método mais comum. Adiciona ele