Enumerado

1. Tipos enumerados (Enumerated Type)

Los enumerados de Pascal son tipos opacos con muy buena encapsulación, y se usan mucho más frecuentemente en el desarrollo diario que los enumerados de otros lenguajes.

Sintaxis básica de definición

type
  TAnimalKind = (akDuck, akCat, akDog);

Convención: añadir un prefijo de dos letras abreviado del nombre del tipo a cada constante del enumerado

  • ak = Animal Kind (abreviatura de TAnimalKind)
  • Propósito: las constantes enumeradas pertenecen por defecto al espacio de nombres global de la unidad. El prefijo reduce drásticamente los conflictos de nombres con otras variables y tipos personalizados.

La letra T al principio de TAnimalKind es opcional sintácticamente, solo es una norma de la industria. Se recomienda mantenerla, ya que permite identificar al instante que se trata de un tipo enumerado.

type
  AnimalKind = (akDuck, akCat, akDog); // Sin T, sintaxis válidaLenguaje del código: JavaScript (javascript)

Notas adicionales:

  1. Los identificadores repetidos no generan errores de compilación inmediatos; distintas unidades pueden declarar nombres iguales;
  2. Aun así, es recomendable evitar conflictos de nombres para mejorar la legibilidad y facilitar las búsquedas globales (grep).

Enumerados con ámbito (enumerados cualificados, {$scopedenums on})

La directiva del compilador {$scopedenums on} aísla las constantes enumeradas dentro de su tipo correspondiente, evitando contaminar el espacio de nombres global

Desactivado por defecto
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program EnumDemo;

type TAnimalKind = (akDuck, akCat);

var k: TAnimalKind;

begin
  k := akDuck; // Usar la constante directamente, sin TAnimalKind.
  WriteLn(k); //Muestra akDuck
end.Lenguaje del código: PHP (php)

Como comentamos antes, el código se ejecuta desde la palabra clave begin.

Usar el prefijo ak es una buena práctica para evitar conflictos; omitirlo no genera errores.

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}

program EnumDemo;

type TAnimalKind = (Duck, Cat);

var k: TAnimalKind;

begin
  k := Duck; 
  WriteLn(k);//Duck
end.Lenguaje del código: PHP (php)

Al activar {$scopedenums on} es obligatorio escribir «NombreTipo.»

  1. Todo acceso requiere calificador de tipo: TAnimalKind.akDuck
  2. El prefijo ak deja de ser necesario; las constantes se simplifican como Duck, Cat, Dog
{$scopedenums on}
type
  TAnimalKind = (Duck, Cat, Dog);
var
  Kind: TAnimalKind;
begin
  Kind := TAnimalKind.Duck; // Calificador de tipo obligatorio
end;Lenguaje del código: PHP (php)

Si se omite el calificador de tipo

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;

type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
  k := Duck; // Sin TAnimalKind.
  WriteLn(k);
end.Lenguaje del código: PHP (php)

Se produce un error de compilación

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(9,8) Error: Identifier not found "Duck"
mydemo.dpr(11,4) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: C:\FPC\3.2.2\bin\i386-Win32\ppc386.exe returned an error exitcodeLenguaje del código: CSS (css)

Si añadimos el calificador de tipo

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;

type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
  k := TAnimalKind.Duck; // Con calificador completo
  WriteLn(k);
end.Lenguaje del código: PHP (php)

El código compila sin problemas

Conversión explícita entre enumerados y números enteros

Los enumerados son tipos opacos; no se pueden asignar directamente valores entre enumerados y enteros, es obligatorio realizar una conversión manual:

  1. Enumerado → Entero: Ord(variableEnumerado)
  2. Entero → Enumerado: conversión explícita TAnimalKind(valorEntero)
  3. Valida siempre el rango numérico antes de convertir un entero a enumerado: intervalo válido 0 ~ Ord(High(TipoEnumerado))
type
  TAnimalKind = (akDuck, akCat, akDog);
var
  Kind: TAnimalKind;
  Num: Integer;
begin
  Kind := akCat;
  Num := Ord(Kind); // akCat tiene el ordinal 1, Num=1

  Num := 2;
  // Validar rango antes de convertir
  if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
    Kind := TAnimalKind(Num);
end;Lenguaje del código: JavaScript (javascript)
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}

program EnumDemo;

type
  TAnimalKind = (akDuck, akCat, akDog);
var
  Kind: TAnimalKind;
  Num: Integer;
begin
  Kind := akCat;
  Num := Ord(Kind); // akCat index is 1,Num=1

  Num := 2;

  if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
    Kind := TAnimalKind(Num);

  WriteLn(Num);//2
end.Lenguaje del código: PHP (php)

Enumerado

Deja una respuesta

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