60 votes

N'Perl ont un type d'énumération?

N'Perl ont un type d'énumération qui respecte les meilleures pratiques, ou peut-être plus important encore, est-il besoin?

Le projet sur lequel je travaille, on utilise des chaînes partout pour désigner des choses qui devraient normalement utiliser un Enum dans un langage comme C#. Par exemple, nous avons un ensemble de numéros de téléphone dans un tableau de hachages, chacune associée à un type de téléphone ("à la Maison", "Travail", "Mobile", etc.):

$phone_number->{type} = 'Home';

Serait-il suffisant pour l'utilisation en lecture seulement un ensemble de variables ici ou devrait d'un Enum être utilisé? J'ai trouvé un enum module CPAN mais il semble utiliser des mots nus qui contrevient à l'une des Perl Best Practices. Ma réflexion sur l'utilisation de variables en lecture seule va quelque chose comme ceci:

use Readonly;

Readonly my $HOME   => 'Home';
Readonly my $WORK   => 'Work';
Readonly my $MOBILE => 'Mobile';

$phone_number->{type} = $HOME;

Est-ce une bonne approche ou est-il un meilleur moyen?

45voto

Ronald Blaschke Points 1822

Non, il n'est pas intégré dans l'enum de construire. Perl ne fait pas beaucoup de typage strict, donc je pense qu'il y a peu de besoin pour une.

À mon avis, l' Readonly approche que vous avez utilisé est solide.

Il y a aussi les plus traditionnels constant pragma.

use constant {
    HOME   => 'Home',
    WORK   => 'Work',
    MOBILE => 'Mobile',
};

$phone_number->{type} = HOME;

En coulisses, il met en place une fonction pour chaque constante qui renvoie la valeur, comme si.

sub HOME () { 'Home' }

Je collerais avec Readonly , sauf si vous voulez prendre avantage de cette propriété, par exemple:

package Phone::Type;

use constant {
    HOME => 'Home',
    #...
};

package main;

print Phone::Type->HOME, "\n";

26voto

Nathan Fellman Points 31310

Perl n'a en fait d'un type enum comme en C. Essayez ceci pour plus de détails.

perldoc enum

Par exemple:

use enum qw(HOME WORK MOBILE);

Maintenant, nous avons:

HOME == 0
WORK == 1
MOBILE == 2

Vous pouvez également définir les indices vous-même:

use enum qw(HOME=0 WORK MOBILE=10 FAX);

Maintenant, nous avons:

HOME == 0
WORK == 1
MOBILE == 10
FAX == 11

Regardez ici pour plus de détails.

Notez que ce n'est pas pris en charge dans toutes les versions de Perl. Je sais que v5.8.3 ne prend pas en charge, tout en v5.8.7 ne.

11voto

Ray Booysen Points 10606

Perl ne prend pas en charge le concept nativement, mais il existe des modules pour ajouter cette fonctionnalité

https://metacpan.org/pod/enum

8voto

jrockway Points 23734

Votre chemin est plus que suffisant.

Vous pouvez également créer des énumérations à l'Orignal::Util::TypeConstraints, si vous arrive d'être en utilisant l'Orignal. (Ce qui devrait être.)

5voto

John Roberts Points 69

J'ai peur que perl est complètement paralysée quand il s'agit de ces énumérations et nommé constantes:

  • enum et En lecture seule ne sont pas des modules de base (au moins à perl 5.8, dont je viens de vérifier). Ceux-ci peuvent ne pas être disponibles sur un système où l'on n'a pas la liberté d'installer de nouveaux modules.

  • "l'utilisation de la Constante" avec "use strict" (que l'on devrait toujours utiliser) est complètement inutilisable, car il génère une charge d'horribles messages d'erreur de la forme:

    Mot nu "FRED" n'est pas autorisé pendant strict "sous-marins" en cours d'utilisation

Espérons qu'ils avez trié ce gâchis en perl 6, si les voit jamais la lumière du jour!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X