Pular para o conteúdo principal

Pattern Matching

Pattern matching permite verificar valores contra padrões e desestruturar dados. Veja como diferentes linguagens lidam com pattern matching.

Pattern Matching Básico​

// Switch statement
switch (value) {
case 1:
console.log("one");
break;
case 2:
case 3:
console.log("two or three");
break;
default:
console.log("other");
}

// Destructuring (object)
const { name, age } = person;
const { name: userName, ...rest } = person;

// Destructuring (array)
const [first, second, ...remaining] = arr;
const [a, , c] = [1, 2, 3]; // skip second

// Nested destructuring
const { address: { city } } = person;

// Default values
const { name = "unknown" } = person;

Principais Conclusões​

  • Matching exaustivo -- Rust e Swift exigem que match/switch cubram todos os casos, prevenindo bugs de ramificações esquecidas; outras linguagens usam default/else como catch-all.
  • Suporte a destructuring -- Rust, Swift, Python e C# oferecem destructuring rico de structs, tuplas e enums; C e Go têm destructuring mínimo ou inexistente.
  • Cláusulas guard -- Rust (if), Swift (where), Python (if), Java 21+ (when) e C# suportam guards de padrão para lógica condicional dentro de braços de match.
  • Tipos de dados algébricos -- Enums de Rust e Swift com valores associados permitem pattern matching em variantes que carregam dados; tagged unions de Zig oferecem capacidades semelhantes.