Como concatenar vetores em Rust: 5 principais erros e suas soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: vetores são simples, até você precisar juntá-los

\n

Imagine: 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.

\n

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\n

Por que a concatenação de vetores em Rust não é uma tarefa tão trivial?

\n

Ao 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
    \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
\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\n

Top 5 erros ao concatenar vetores em Rust

\n

Vamos passar pelos erros mais comuns que iniciantes (e não só) cometem.

\n\n

Erro nº1: Usar + para Vec (não compila)

\n

A tentativa mais intuitiva, mas incorreta:

\n
let v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet v3 = v1 + v2; // Erro! cannot add `Vec<{integer}>` to `Vec<{integer}>`
\n

O operador + é sobrecarregado apenas para strings e números, não para vetores. Rust não permite somar coleções diretamente.

\n\n

Erro nº2: Esquecer da movimentação e perder dados

\n

Muitos usam append e se surpreendem que o primeiro vetor ficou vazio:

\n
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.
\n

append move os elementos do segundo vetor para o primeiro, deixando v2 vazio. Isso é eficiente, mas nem sempre esperado.

\n\n

Erro nº3: Clonagem ingênua de tudo

\n

Quando é necessário manter ambos os vetores originais, iniciantes frequentemente escrevem:

\n
let v1 = vec![1, 2, 3];\nlet v2 = vec![4, 5, 6];\nlet mut v3 = v1.clone();\nv3.extend(v2.clone()); // Duas clonagens!
\n

Para vetores grandes com String ou estruturas complexas, isso prejudica o desempenho. É melhor usar referências ou chain.

\n\n

Erro nº4: Ignorar capacity ao usar extend

\n

Um simples extend pode causar múltiplas realocações:

\n
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.
\n

Se você sabe o tamanho final, é melhor alocar memória antecipadamente: v1.reserve(v2.len()).

\n\n

Erro nº5: Confundir extend e append

\n

extend 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.

\n\n

Melhores maneiras de concatenar vetores em Rust (com exemplos)

\n

Agora que conhecemos o inimigo, vamos analisar as abordagens corretas. Cada uma é boa para seu cenário.

\n\n

Método 1: extend — universal e compreensível

\n

O método mais comum. Adiciona ele

Blogs

Book Recommendations