diegoRodicio

View Categories

📦 Rexistros

Tempo de lectura estimado: 1 minutos

📦 Agrupar datos relacionados

Un rexistro (record) reúne varios valores nun só dato, sen crear unha clase. Cada campo ten o seu tipo. Por exemplo, podemos gardar xuntos o nome dun alumno (String) e a súa nota (int).

🔢 Campos posicionais

Escribimos os valores entre parénteses, separados por comas. Accedemos con .$1, .$2… As posicións dos rexistros empezan en 1, a diferenza dos índices das listas.

(String, int) alumno = ('Xurxo', 7);
print(alumno.$1); // Xurxo
print(alumno.$2); // 7

(String, int) é o tipo; ('Xurxo', 7) é o valor. Tamén podemos escribir var alumno = ('Xurxo', 7); e deixar que Dart deduza o tipo.

🏷️ Campos nomeados

Se damos nome aos campos, o acceso resulta máis claro:

final alumno = (nome: 'Iria', nota: 9);
print(alumno.nome); // Iria
print(alumno.nota); // 9

Se queremos indicar o tipo de forma explícita, os campos nomeados van entre chaves dentro dos parénteses:

({String nome, int nota}) alumno = (nome: 'Iria', nota: 9);
print('${alumno.nome}: ${alumno.nota}'); // Usamos os nomes dos campos.

Fíxate na diferenza: o tipo é ({String nome, int nota}) e o valor é (nome: 'Iria', nota: 9).

  • Os nomes forman parte do tipo
  • A orde dos campos nomeados non importa.
({String nome, int nota}) alumno = (nome: 'Iria', nota: 9);
print('${alumno.nome}: ${alumno.nota}'); // Usamos os nomes dos campos.

(String nome, int nota) alumno2 = ('Xoel', 8);
(String, int) alumno3 = ('Anxo', 8);

// alumno = alumno2; // ERRO: tipos distintos.
// alumno = alumno3; // ERRO: tipos distintos.
alumno2 = alumno3;   // OK: son do mesmo tipo.

🔐 Os campos non se poden reasignar

Un rexistro ten un número fixo de campos e non podemos cambiar o valor dun campo. Se a variable non é final, podemos asignarlle outro rexistro compatible:

var alumno = (nome: 'Roi', nota: 4);
// alumno.nota = 6; // Non válido: o campo non se pode reasignar.
alumno = (nome: 'Roi', nota: 6); // Substituímos o rexistro completo.
print(alumno);

Se un campo contén unha lista modificable, esa lista si pode cambiar por dentro. O que non podemos facer é asignar outra lista a ese campo.

⚖️ Comparar rexistros

Dous rexistros son iguais se teñen a mesma estrutura e os valores dos campos correspondentes son iguais.

Nos campos nomeados, a orde non importa, pero si o nome dos campos:

final primeiro = (nome: 'Iria', nota: 9);
final segundo = (nota: 9, nome: 'Iria');

print(primeiro == segundo); // true

📋 Gardar rexistros nunha lista

Unha lista permite reunir varios rexistros do mesmo tipo. List<({String nome, int nota})> significa «lista de rexistros cun nome e unha nota».

Nun mapa relacionabamos unha clave cun valor; nun rexistro agrupamos campos fixos cos seus tipos. Para o proxecto podemos escoller a estrutura que mellor represente os datos.

🧪 Exemplo completo

🔗 Ver o código en DartPad — https://dartpad.dev/?id=bde769dba546fba6df383231ad5e9eda

No apartado de funcións veremos como devolver varios datos xuntos nun rexistro. Extraer os campos en variables mediante desestruturación queda en «Para saber máis».

📚 Consulta: rexistros en Dart — https://dart.dev/language/records.