Enumeration

Bonjour,

Quelq’un peut me dire comment déclarer une énumération (type C++, Java
5) en Ruby ?

Merci,

Julien

Julien :

Quelq’un peut me dire comment déclarer une énumération (type C++,
Java 5) en Ruby ?

Question annexe, as-tu vraiment besoin d’énumération ?

Par exemple, ne peut-on pas utliser à la place des Symboles ?

РJean-Fran̤ois.

Sinon il faut ajouter:
"
include enumerable
"
regarde aussi

Enumerable::Enumerator.new

Bref, je ne suis pas sur que tu en ais vraiment bessoin (voir la
réponse de Jean-François) mais au cas où , c’est vers ces objets qu’il
faut s’orienté :slight_smile:

2007/1/18, Jean-François [email protected]:

En fait, j’ai en base un champ type :slight_smile: qui est un entier qui peut
prendre un intervalle de valeurs donné. J’aimerais pour cela avoir une
énumération constante dans mon code.

Merci,

Julien

Tiens c’est curieux !

Le fait que l’Enum n’existe pas n’existe pas en Ruby (@Yannick, je ne
pense
pas que la question ait un rapport avec Enumerable dans ce contexte)
révèle-t-il qu’on n’en a jamais besoin en Ruby ?

Par exemple, ne peut-on pas utliser à la place des Symboles ?
Non justement puisqu’en fait on veut des entiers.

L’enum est vraiment un idiome C que Java et C# on hérité et qui est
sutout
pratique pour appeler une API C qui s’attend à recevoir des flags
entiers et
qu’on ne veut pas (oh combien à juste raison) utiliser des valeurs
littérales.

par exemple,

typedef enum
{
perdu = 0,
gagne /* Vaudra automatiquement 1 */
}
Tirage;

N’éprouve-t-on jamais le besoin de faire ça en ruby ?!

Le seul truc approchant que je voie est la classe Struct :

my_enum = Struct.New( :bleu, :blanc, :rouge )

my_enum.bleu = 0x0000FF
my_enum.blanc = 0xFFFFFF
my_enum.rouge = 0xFF0000

Le fait que ce soit lourdingue, et bien moins élégant que l’enum C
m’incite
à penser que l’Enum n’est pas dans l’esprit Ruby et que dans la pratique
on
s’en passe car on doit pouvoir exprimer la même chose autrement.

Si qqun voit pourquoi je suis preneur…

A la réflexion (pourquoi pas d’enums en Ruby) il y a deux aspects
purement
liés à C/C++ qui n’ont pas lieu d’être en Ruby :
le typage static et la perf pure.

L’enum C/C+ permet d’aliaser une valeur numérique littérale tout en la
typant fortement de façon à ne pas pouvoir l’utiliser à mauvais escient
(sinon à caster en int pour forcer).

On hurlerait si on voyait un hash utilisé en C++ pour associer des int Ã
des
identifiants (hormis le fait qu’il n’y a pas de tableaux associatifs en
natif), en Ruby, par contre, ça ne choque pas.

Donc, en résumé, le C++ privilégie la perf et, en conséquence, sécurise
statiquement le code d’où l’enum, Ruby à une philosophie opposée d’où
l’abscence d’enum.

Philippe:

Le fait que l’Enum n’existe pas n’existe pas en Ruby (@Yannick, je
ne pense pas que la question ait un rapport avec Enumerable dans
ce contexte) révèle-t-il qu’on n’en a jamais besoin en Ruby ?

Par exemple, ne peut-on pas utliser à la place des Symboles ?
Non justement puisqu’en fait on veut des entiers.

Je n’avais pas cette info avant de poser ma question.

Si on peut s’en passer, c’est quand même plus simple :

DIRECTIONS = [ :nord, est, :sud, :ouest ]

gagne /* Vaudra automatiquement 1 */
}
Tirage;

N’éprouve-t-on jamais le besoin de faire ça en ruby ?!

Il y a pleins de manière de le faire, par exemple avec
une table de hachage. Tout dépend si l’ordre est véritablement
important.

RESULTAT = { :perdu => 0, :gagne => 1 }

Avec des constantes :

module Shadok
GA, BU, ZO, MEU = *[0x0000FF, 0xFFFFFF, 0xFF0000, 0xFF00FF]
end

puts ‘pomper’ until Shadok::GA * Shadok::ZO == Shadok::BU * Shadok::MEU

Pour avoir les constantes : Shadok.constants

Pour les avoir ordonnées par leur valeur :

def Shadok.ordered_constants
constants.sort_by { |c| const_get© }
end

Le seul truc approchant que je voie est la classe Struct :

my_enum = Struct.New( :bleu, :blanc, :rouge )

my_enum.bleu = 0x0000FF
my_enum.blanc = 0xFFFFFF
my_enum.rouge = 0xFF0000

On peut faire comme ça. On peut créer une classe pour ça.
On peut utiliser un tableau de tableaux de 2 éléments :

CHIFFRES_ROMAINS = [ [‘M’, 1000], [‘C’, 100], [‘X’, 10], [‘V’, 5] ] #

Il y a pleins de méthodes.

Le fait que ce soit lourdingue, et bien moins élégant que l’enum C
m’incite à penser que l’Enum n’est pas dans l’esprit Ruby et que
dans la pratique on s’en passe car on doit pouvoir exprimer la
même chose autrement.

Ouais on a pleins d’outils pour pouvoir s’en passer, Exception,
Range, Tableau, Hash, Symboles, constantes…

Si qqun voit pourquoi je suis preneur…

Pourquoi pas avec Set…

РJean-Fran̤ois.