Bonjour,
Une structure m'a tout l'air de ressembler a une class.
Qu'est ce qui les differencie vraiment?
Dans quelles circonstances on les utilise?
D'avance merci.
Version imprimable
Bonjour,
Une structure m'a tout l'air de ressembler a une class.
Qu'est ce qui les differencie vraiment?
Dans quelles circonstances on les utilise?
D'avance merci.
Hello,
Dans les langages classiques, une structure est un type de données composé de plusieurs champs (variables) de différents types y compris d'autres types de données composé.
A la base, le type structure est très proche du type classe. D'ailleurs en C++, on peut tout à fait ajouter des méthodes à une structure si mes souvenirs sont bons, ce qui en fait réellement une pseudo classe.
En Ruby, les types de données sont définis par des classes donc la structure n'est pas un type en tant que tel, mais peut être facilement émulée par une classe contenant d'autres variables et pas de méthode (exception faite des méthodes d'accès R/W à ces attributs dans le cas de Ruby, bien sûr).
La librairie struct propose simplement un moyen plus concis de déclarer ce type de classe qui ne contient que des attributs et pas de méthode.
Bref, en POO, la structure ne s'utilise pas très couramment. A réserver aux classes dont seuls les attributs nous intéresse.
La classe Struct est un générateur de classe. Son constructeur créé des classes à la volée contenant uniquement des méthodes d'accès aux attributs spécifiés en argument. La classe ainsi obtenue peut être utilisée pour instancier des objets qui auront les méthodes correspondantes.
Struct permet d'obtenir simplement et surtout dynamiquement des classes sans avoir à les définir explicitement dans le code.
Ainsi,
peut être remplacé par:Code:
1
2
3
4 class MaClasse attr_accessor :nom, :prenom end
Code:
1
2 MaClasse = Struct.new(:nom,:prenom)
Oui, mais c'est également possible avec une Class toute bête :Citation:
Struct permet d'obtenir simplement et surtout dynamiquement des classes sans avoir à les définir explicitement dans le code.
Ok, Struct rajoute quelques méthodes qui peuvent sûrement s'avérer utiles, mais honnêtement j'ai jamais vu personne l'utiliser :roll:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 MaClasse = Class.new => MaClasse >> MaClasse.send(:attr_accessor, :nom, :prenom) # attr_accessor est une méthode privée, donc on est obligé d'utiliser send() => nil >> a = MaClasse.new => #< MaClasse:0x35e88c> >> a.nom => nil >> a.nom = "Albert" => "Albert" >> a.nom => "Albert"
Il y a aussi la classe OpenStruct qui fait la même chose qu'une Struct, mais sans avoir besoin de déclarer les variables d'instance.
En gros, c'est un Hash déguisé.Code:
1
2
3
4
5
6
7
8
9
10
11 require 'ostruct' ostruct = OpenStruct.new ostruct.var = 100 ostruct.truc = 1 p ostruct.var + ostruct.truc #=>101 p ostruct.instance_variable_get(:@table) {:truc=>1, :var=>100}