Forum: Rails France Enumeration

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
0aa50f7fd63018e47fbbf87b7be6626f?d=identicon&s=25 Julien Biard (Guest)
on 2007-01-18 17:20
(Received via mailing list)
Bonjour,

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

Merci,

Julien
13ea48f056b19349027d2f4a6921a46a?d=identicon&s=25 Jean-François (Guest)
on 2007-01-18 17:35
(Received via mailing list)
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.
400818411253800c62377dcac0b771d7?d=identicon&s=25 Yannick Francois (Guest)
on 2007-01-18 17:40
(Received via mailing list)
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é :)



2007/1/18, Jean-François <jf.web3@gmail.com>:
0aa50f7fd63018e47fbbf87b7be6626f?d=identicon&s=25 Julien Biard (Guest)
on 2007-01-18 18:12
(Received via mailing list)
En fait, j'ai en base un champ type :) 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
64cefc5969da4ae702d86c9f26cb8733?d=identicon&s=25 philippe lachaise (Guest)
on 2007-01-19 16:29
(Received via mailing list)
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...
13ea48f056b19349027d2f4a6921a46a?d=identicon&s=25 Jean-François (Guest)
on 2007-01-19 16:31
(Received via mailing list)
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(c) }
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.
64cefc5969da4ae702d86c9f26cb8733?d=identicon&s=25 philippe lachaise (Guest)
on 2007-01-19 16:31
(Received via mailing list)
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.
This topic is locked and can not be replied to.