7
votes

Quel est le but d'une structure anonyme de rubis?

Ils peuvent être définis comme celui-ci

struct.new (: x,: y)

Mais qu'est-ce qui peut être utilement fait avec eux? Spécifiquement, comment puis-je créer une instance d'une telle structure? Cela ne fonctionne pas

struct.new (: x => 1,: y => 1)

(vous obtenez TypeError: impossible de convertir le hasch en chaîne ).

J'utilise Ruby 1.9.2.

mise à jour:

Bon pointeurs jusqu'à présent, merci. Je suppose que je me suis posé que je me suis retrouvé à plusieurs reprises vouloir faire cela

struct.new (: x => 1,: y => 1)

juste pour que je puisse passer un objet autour de l'endroit où je peux écrire obj.x au lieu de, dites, instantiant un hachage et avoir à écrire obj [: x] . Dans ce cas, je veux que la structure soit vraiment anonyme - je ne veux pas polluer mon espace de noms avec quoi que ce soit en nommant ce qui est renvoyé à partir du struct.new appel. La chose la plus proche à cela, comme déjà suggéré est

struct.new (: x,: y) .new (1, 1)

Mais comment les aimez-vous des pommes? Je ne suis pas sûr de le faire. Est-il raisonnable de s'attendre à pouvoir définir et instancier une structure anonyme en une fois (dans le cadre de Core Ruby)? Je suppose que lorsque je lisais les documents officiels rubis sur struct.new je suppose que le mot "anonyme" permet à cela, mais ça ne le fait pas.


2 commentaires

Cela pourrait également être intéressant pour vous d'écrémer: Stackoverflow.com/questions / 1177594 / Ruby-Struct-Vs-OpenStruc T


Oui, j'ai trouvé cela avant de poster mais cela ne traite pas directement des structs anonymes.


6 Réponses :


3
votes

Je suis très sûr sur le but, mais struct.new code> retourne classe afin

irb(main):001:0> Struct.new(:x,:y)
=> #<Class:0x2914110>
irb(main):002:0> Struct.new(:x,:y).new(1,2)
=> #<struct x=1, y=2>


2 commentaires

Oui, cette deuxième ligne est belle ou très laide, je ne peux pas décider!


Semble plus moche puis beau pour moi. C'est une violation de la loi de Demeter, je suppose. Je ne connais pas très bien l'utilisation des structures.



18
votes

struct.new code> renvoie une classe code>, afin que vous puissiez, par exemple, attribuez-la à une constante comme ceci:

require 'ostruct'

point = OpenStruct.new(:x => 3, :y => 5)


2 commentaires

+1 Première explication que j'ai lue qui le rend effectivement sonner un peu utile.


Comme la suggestion openstruct - c'est le plus comme ce que je m'attendais à ce que je pourrais faire avec struct.new .



4
votes

Vous créez d'abord une structure, puis vous pouvez créer des instances de celui-ci. C'est un moyen de créer des objets de données sans avoir à déclarer une classe. Fondamentalement, c'est la même chose qu'un hasch, mais il est plus propre d'accéder aux objets. Vous pouvez obtenir des objets en le référant via des méthodes d'accessor ordinaires.

http://www.ruby-doc.org/core-1.9.3/struct.html xxx


0 commentaires

0
votes

comme pour la création d'instances: xxx


0 commentaires

4
votes

Eh bien, vous pouvez utiliser des structures lorsque vous ne voulez pas réellement écrire une classe avec des accesseurs. Il est pratique de simplement écrire xxx

au lieu de xxx

comme TOKLAND souligné correctement (merci!), Une structure vous donne également une belle #initialiser la méthode automatiquement. Donc, ce qui suit est possible sans autre code: xxx


1 commentaires

Avec la structure, vous obtenez aussi un initialiseur. (Type -> Accessor -> Accessor)



1
votes

openstruct est probablement ce que vous voulez, mais j'ai couru dans une situation récemment où openstruct n'a pas fonctionné car je devais soulever une erreur lors de la tentative d'accès à un indéfini attribut. struct fait ceci: xxx

juste quelque chose à garder à l'esprit.


0 commentaires