Quand dois-je utiliser Struct vs OpenStruct?
En général, quels sont les avantages et les inconvénients de l'utilisation d'un OpenStruct par rapport à une Structure? Ce type d'usage général-cas correspondent à chacun de ces?
- J'ai quelques remarques à propos de Struct vs OpenStruct vs Hachage dans mon récent commentaire de blog "les Structures à l'intérieur de", juste au cas où quelqu'un est intéressé.
- Les informations concernant la vitesse de Hachage, Struct et OpenStruct est pas à jour. Voir stackoverflow.com/a/43987844/128421 pour une plus récente de référence.
Vous devez vous connecter pour publier un commentaire.
Avec un
OpenStruct
, vous pouvez créer artificiellement des attributs. UnStruct
, d'autre part, doit avoir ses attributs définis lors de sa création. Le choix de l'un sur l'autre devrait être fondée principalement sur si vous devez être en mesure d'ajouter des attributs plus tard.La façon de penser est que le milieu de terrain du spectre entre les Hachages d'un côté et des cours sur l'autre. Ils impliquent une plus concrète de la relation entre les données que ne le fait une
Hash
, mais ils n'ont pas les méthodes d'instance comme le ferait une classe. Un tas d'options pour une fonction, par exemple, a de sens que dans une table de hachage; ils ne sont que vaguement liés. Un nom, courriel et numéro de téléphone requis par une fonction pourrait être emballés ensemble dans unStruct
ouOpenStruct
. Si ce nom, courriel et numéro de téléphone requis méthodes pour fournir le nom dans les deux "prénom" et "nom, prénom" formats, vous devez créer une classe pour gérer.class Point < Struct.new(:x, :y); methods here; end
Point = Struct.new(:x, :y) { methods here }
. (source) bien sûr,{ ... }
il peut être écrit comme une multi-ligne (blocdo ... end
) et, je pense, c'est la voie préférée.Autre indice:
Pour les impatients qui veut avoir une idée de l'indice de référence des résultats, sans les exécuter eux-mêmes, ici, c'est la sortie du code ci-dessus (sur un MB Pro 2.4 GHz i7)
Mise à JOUR:
Comme des Rubis 2.4.1 OpenStruct et Struct sont beaucoup plus proches de la vitesse. Voir https://stackoverflow.com/a/43987844/128421
PRÉCÉDEMMENT:
Complet: Struct vs Classe vs de Hachage vs OpenStruct
L'exécution de code similaire comme burtlo, sur Ruby 1.9.2, (1 des 4 cœurs x86_64, 8 go de RAM) [tableau édité pour aligner les colonnes]:
OpenStructs sont sloooooow et de mémoire intensive , et n'est pas à l'échelle de grands ensembles de données
La création de 1 Mio OpenStructs est ~100 fois plus lent que la création de 1 Mio Hachages.
Les cas d'utilisation pour les deux sont tout à fait différents.
Vous pouvez penser à la Structure de classe en Ruby 1.9 comme un équivalent de la
struct
déclaration C. RubyStruct.new
prend un ensemble de noms de champ comme arguments et retourne une nouvelle Classe. De même, en C, unstruct
déclaration prend un ensemble de champs et permet au programmeur d'utiliser le nouveau type complexe, tout comme il serait tout type intégré.Ruby:
C:
La OpenStruct classe peut être comparé à un anonyme struct déclaration en C. Il permet au programmeur de créer un instance d'un type complexe.
Ruby:
C:
Voici quelques cas d'utilisation courants.
OpenStructs peut être utilisé pour convertir facilement des hachages à des objets qui répondent à toutes les clés de hachage.
Les structures peuvent être utiles pour l'abréviation des définitions de classe.
OpenStructs utiliser beaucoup plus de mémoire et sont plus lents artistes interprètes ou exécutants contre des Structures.
Sur mon système, le code suivant exécuté en 14 secondes et consommé 1,5 GO de mémoire. Votre kilométrage peut varier:
Qui fini presque instantanément et consommé de 26,6 MO de mémoire.
Struct
:OpenStruct
:Ont un coup d'oeil à l'API à l'égard de la nouvelle méthode. Beaucoup de différences peuvent y être trouvés.
Personnellement, j'aime assez OpenStruct, que je n'ai pas à définir la structure de l'objet à l'avance, et juste ajouter des trucs que je veux. Je suppose que ce serait son principal (dés)avantage?
À l'aide de @Robert le code, j'ai ajouter Hashie::Purée à l'indice de référence de l'élément et a obtenu ce résultat: