Funções Genéricas
Rust suporta genéricos, o que permite abstrair algoritmos ou estruturas de dados (como ordenação ou uma árvore binária) sobre os tipos usados ou armazenados.
/// Escolhe `even` (par) ou `odd` (ímpar) dependendo do valor de `n`. fn pick<T>(n: i32, even: T, odd: T) -> T { if n % 2 == 0 { even } else { odd } } fn main() { println!("escolheu um número: {:?}", pick(97, 222, 333)); println!("escolheu uma tupla: {:?}", pick(28, ("cachorro", 1), ("gato", 2))); }
-
Rust infere um tipo para T com base nos tipos dos argumentos e valor de retorno.
-
Isto é semelhante aos templates C++, mas Rust compila parcialmente a função genérica imediatamente, de modo que a função deve ser válida para todos os tipos que correspondem às restrições. Por exemplo, tente modificar
pick
para retornareven + odd
sen == 0
. Mesmo que apenas a instânciapick
com inteiros seja usada, Rust ainda a considera inválida. C++ permitiria que você fizesse isso. -
O código genérico é transformado em código não genérico com base nos locais de chamada. Esta é uma abstração sem custo: você obtém exatamente o mesmo resultado como se tivesse codificado as estruturas de dados sem a abstração.