Ils peuvent être définis comme celui-ci p>
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 p>
(vous obtenez J'utilise Ruby 1.9.2. P>
mise à jour: p>
Bon pointeurs jusqu'à présent, merci. Je suppose que je me suis posé que je me suis retrouvé à plusieurs reprises vouloir faire cela p>
juste pour que je puisse passer un objet autour de l'endroit où je peux écrire 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 (: x,: y) code> p>
struct.new (: x => 1,: y => 1) code> p>
TypeError: impossible de convertir le hasch en chaîne code>). P>
struct.new (: x => 1,: y => 1) code> p>
obj.x code> au lieu de, dites, instantiant un hachage et avoir à écrire obj [: x] code> . Dans ce cas, je veux que la structure soit vraiment em> 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 code> appel. La chose la plus proche à cela, comme déjà suggéré est p>
struct.new (: x,: y) .new (1, 1) code> p>
struct.new code> je suppose que le mot "anonyme" permet à cela, mais ça ne le fait pas. p>
6 Réponses :
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>
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.
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)
+1 Première explication que j'ai lue qui le rend effectivement sonner un peu utile.
Comme la suggestion code> openstruct code> - c'est le plus comme ce que je m'attendais à ce que je pourrais faire avec struct.new code>.
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 p>
comme pour la création d'instances:
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 au lieu de p> 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: p>
Avec la structure, vous obtenez aussi un initialiseur. (Type -> Accessor -> Accessor)
juste quelque chose à garder à l'esprit. p> p> openstruct code> est probablement ce que vous voulez, mais j'ai couru dans une situation récemment où openstruct code> n'a pas fonctionné car je devais soulever une erreur lors de la tentative d'accès à un indéfini attribut. struct code> fait em> ceci:
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.