Pattern

1. Patrón lógico OR A || B

Coincide con cualquiera de los subpatrones; todas las ramas deben definir exactamente el mismo conjunto de variables.

enum Color { red, yellow, blue, green }
void main() {
  Color c = Color.red;
  bool primary = switch(c) {
    Color.red || Color.yellow || Color.blue => true,
    _ => false
  };
  print(primary); // true
}Lenguaje del código: Dart (dart)

2. Patrón lógico AND A && B

Ambos subpatrones deben coincidir simultáneamente; los subpatrones no pueden vincular variables con el mismo nombre.

void main() {
  switch((2, 3)) {
    // Error: ambos subpatrones vinculan la variable b, conflicto de nombres
    // case (var a, var b) && (var b, var c): print("ok");
    case (var a, var b) && (>1, <5):
      print("a=$a,b=$b"); // a=2,b=3
  }
}Lenguaje del código: Dart (dart)

Aquí el patrón (>1, <5) requiere que el primer número sea mayor que 1 y el segundo menor que 5.

3. Patrón relacional < > <= >= == !=

Se usa para comprobar rangos numéricos, combinado habitualmente con && para limitar los límites de valores

String asciiCharType(int charCode) {
  const space = 32, zero = 48, nine = 57;
  return switch(charCode) {
    < space => "Carácter de control",
    == space => "Espacio",
    > space && < zero => "Puntuación",
    >= zero && <= nine => "Dígito",
    _ => "Otro"
  };
}
void main() {
  print(asciiCharType(50)); // Dígito
  print(asciiCharType(33)); // Puntuación
}Lenguaje del código: Dart (dart)

Este ejemplo utiliza el código ASCII para representar caracteres de control, números y símbolos. El parámetro charCode del switch sigue estas reglas: menor que 32 = carácter de control, igual a 32 = espacio, entre 32 y 48 = puntuación, de 48 a 57 inclusive = dígito, todo lo demás se clasifica como otro.

4. Patrón de conversión forzada de tipo sub as Type

Realiza una conversión explícita de tipo durante la desestructuración; lanza una excepción en tiempo de ejecución si los tipos no coinciden

void main() {
  (num, Object) rec = (10, "hello");
  var (i as int, s as String) = rec;
  print(i + 5); // 15
  print(s.toUpperCase()); // HELLO
}Lenguaje del código: Dart (dart)

En este ejemplo, el registro rec se desestructura en i y s. Si el primer elemento no es entero o el segundo no es cadena, se produce una excepción en ejecución.

Ver el ejemplo con error a continuación:

void main() {
  (num, Object) rec = (9.3, "hello");
  var (i as int, s as String) = rec;
  print(i + 5); // 15
  print(s.toUpperCase()); // HELLO
}Lenguaje del código: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'double' is not a subtype of type 'int' in type cast
#0      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:3:10)
#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)Lenguaje del código: PHP (php)

5. Patrón de comprobación nula sub?

Solo coincide si el valor no es nulo; las variables internas se elevan automáticamente a tipo no anulable. Si el valor es null, falla la coincidencia sin lanzar errores.

void main() {
  String? str = "test";
  switch(str) {
    case var s?:
      print(s.length); // s es cadena no anulable, salida 4
    case null:
      print("Valor nulo");
  }
}Lenguaje del código: Dart (dart)

6. Patrón de aserción no nula sub!

Solo coincide si el valor no es nulo; si el valor es null, lanza inmediatamente una excepción en tiempo de ejecución

void main() {
  List<String?> row = ["user", "bob"];
  switch(row) {
    case ["user", var name!]:
      print(name); // name es cadena no anulable
  }

  // Uso en desestructuración de variables
  (int?, int?) pos = (2, 3);
  var (x!, y!) = pos;
  print(x + y);
}Lenguaje del código: Dart (dart)

Desglose de var name!

  • var namePatrón de variablevar declara una nueva variable local name y vincula el valor si la coincidencia es exitosa;
  • !Patrón de aserción nula postfijo — Obliga a que el valor actual no sea null; se produce error en ejecución si lo es.

Significado combinado: var name! crea una nueva variable name y afirma simultáneamente que su valor no puede ser nulo.

7. Patrón constante

Literales, constantes con nombre, constructores const y colecciones const son todos patrones constantes; hay coincidencia si los valores son idénticos

Tipos soportados: números, cadenas, booleanos, constantes nombradas, objetos / listas const

void main() {
  const target = 10;
  int num = 10;
  switch(num) {
    case 1: print("Uno");
    case target: print("Coincide con la constante 10");
    case const [1,2]: print("Lista constante");
    default: print("Otro");
  }
}Lenguaje del código: Dart (dart)

Resultado de ejecución

Coincide con la constante 10

8. Patrón de variable var x / int x / final x

Vincula una nueva variable local al coincidir; si se añade anotación de tipo, valida simultáneamente el tipo del valor

void main() {
  switch((99, "dart")) {
    case (int a, String b):
      print("$a $b"); // 99 dart
    case (int a, int b):
      print("Dos valores numéricos");
  }
}Lenguaje del código: Dart (dart)

9. Patrón de identificador

Su comportamiento se divide en tres contextos:

  1. Contexto de declaración var (a,b):Crea nuevas variables
  2. Contexto de asignación (a,b) = val:Sobrescribe variables existentes
  3. Contexto de coincidencia switch:Se trata como constante (salvo _)
void main() {
  const c = 5;
  int val = 2;
  switch(val) {
    case c: print("Coincide con la constante c");
    default: print("Sin coincidencia"); // Se ejecuta esta línea
  }
}
Lenguaje del código: Dart (dart)

10. Patrón entre paréntesis (subPatrón)

Modifica la prioridad de los operadores de patrón para diferenciar el orden de evaluación de || y &&

void main() {
  bool x = true, y = true, z = false;
  bool test = switch(true) {
    (x || y) && z => true,
    _ => false
  };
  print(test); // false
}
Lenguaje del código: Dart (dart)

11. Patrón de lista

Coincide con objetos List y desestructura elementos por posición; soporta el operador rest ... para capturar cualquier cantidad de elementos restantes

1. Coincidencia básica de lista
void main() {
  const a = "a", b = "b";
  var arr = ["a", "b"];
  switch(arr) {
    case [a, b]: print("Coincidencia encontrada");
    default: print("Sin coincidencia");
  }
}Lenguaje del código: Dart (dart)
2. Captura de elementos restantes con rest
void main() {
  var [a, b, ...rest, c, d] = [1,2,3,4,5,6,7];
  print("$a $b $rest $c $d"); // 1 2 [3, 4, 5] 6 7
}
Lenguaje del código: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
1 2 [3, 4, 5] 6 7Lenguaje del código: CSS (css)

12. Patrón Map {"clave": subP}

Coincide con objetos Map y solo valida las claves especificadas; si falta una clave objetivo lanza StateError, las claves extra no mencionadas se ignoran

void main() {
  var data = {"user": ["Lily", 13]};
  if(data case {"user": [String name, int age]}) {
    print("$name $age"); //Lily 13
  }
}Lenguaje del código: JavaScript (javascript)

13. Patrón de registro

Dos variantes: registro posicional (p1,p2), registro con nombre (k:p1,k2:p2)

Admite la abreviatura :var para omitir nombres de campo repetidos

void main() {
  // Desestructuración de registro posicional
  var (name, age) = ("Doug", 25);
  // Desestructuración abreviada de campos nombrados
  final (:name, :age) = (name: "Tom", age: 18);
}
Lenguaje del código: JavaScript (javascript)

14. Patrón de objeto Clase(prop: p)

Coincide con objetos del tipo indicado y desestructura propiedades getter; admite abreviatura :var

class Point {
  final int x, y;
  Point(this.x, this.y);
}

void main() {
  Point p = Point(10, 20);
  var Point(:x, :y) = p;
  print("$x $y");
}
Lenguaje del código: JavaScript (javascript)

15. Patrón comodín _

Coincide con cualquier valor sin vincular variable; se usa como marcador de posición o solo para comprobar tipo sin extraer el valor

void main() {
  var arr = [1,2,3];
  var [_, mid, _] = arr;
  print(mid); // 2

  switch((10, "abc")) {
    case (int _, String _):
      print("Coincidencia de tipo exitosa");
  }
}Lenguaje del código: JavaScript (javascript)

Pattern

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *