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 name:Patrón de variable —vardeclara una nueva variable localnamey 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:
- Contexto de declaración
var (a,b):Crea nuevas variables - Contexto de asignación
(a,b) = val:Sobrescribe variables existentes - 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