2009-02-08 6 views
49

Est-ce que quelqu'un utilise des tuples dans Ruby? Si oui, comment peut-on implémenter un tuple? Les hachages Ruby sont sympas et fonctionnent presque aussi bien, mais j'aimerais vraiment voir quelque chose comme la classe Tuple en Python, où vous pouvez utiliser la notation . pour trouver la valeur que vous cherchez. Je le veux afin que je puisse créer une implémentation de D, similaire à Dee pour Python.Utilisation de tuples dans Ruby?

+0

Avez-vous mis en œuvre jamais D en Ruby? Si oui, avez-vous le lien? J'ai travaillé sur quelque chose de similaire récemment, et j'aimerais voir ce que vous avez fait jusqu'à présent. – dkubb

+1

Non; Je ne suis jamais allé aussi loin. J'ai tourné autour de plusieurs autres choses en essayant d'y revenir. J'ai trouvé plusieurs bibliothèques qui semblent aider: LazyList et arel. Je suis essentiellement arrivé à la conclusion que LINQ dans .NET était presque là, puis trouvé arel, qui était également proche. L'utilisation de LazyList et la suppression de la conversion directe vers SQL, dont le dernier est également un objectif du projet, vous permettraient presque d'y arriver. Cela dit, j'aimerais voir ce que vous avez jusqu'ici. Je suis encore un peu loin d'y revenir. –

+0

L'ambition est une autre bibliothèque intéressante, mais elle n'a pas été mise à jour depuis un certain temps. C'est celui que j'ai trouvé en premier. arel a l'air d'avoir continué dans la même tradition. –

Répondre

44

OpenStruct?

bref exemple:

require 'ostruct' 

person = OpenStruct.new 
person.name = "John Smith" 
person.age  = 70 
person.pension = 300 

puts person.name  # -> "John Smith" 
puts person.age  # -> 70 
puts person.address # -> nil 
+0

C'est exactement ce que je cherchais. Merci! –

+2

np :) pour vous répondre: non je n'utilise pas de tuples dans ruby, comme openstructs ou autre. J'utilise des classes à l'extrémité supérieure et des hachages à l'extrémité inférieure :) –

+9

c'est une mauvaise réponse, juste un lien? Sérieusement? que se passe-t-il si/quand le lien est brisé? –

25

Basé sur le fait que vous parlez de hash et. notation Je vais supposer que vous voulez dire un type différent de tuple que le tri (1. "a"). Vous recherchez probablement la classe Struct. par exemple:

Person = Struct.new(:name, :age) 
me = Person.new 
me.name = "Guy" 
me.age = 30 
+0

C'est proche, mais devoir nommer ça me dérange. Je cherchais quelque chose comme le genre (1. "a") mais avec la notation get/set de la propriété que vous décrivez. –

+6

@panesofglass, inutile de ne rien nommer: a = Struct.new (: nom,: age) .new; a.name = "Guy" – paradoja

+0

Puis-je définir 'a = Struct.new (: nom,: âge)' et plus tard dire a.new? Je suppose que oui. Je vais devoir vérifier ça. Ce serait beaucoup plus explicite quant à ce que je veux. –

9

Bien que ce ne soit pas strictement un tuple (ne peut pas faire la notation dot des membres), vous pouvez attribuer une liste de variables à partir d'une liste, qui souvent résoudre des problèmes avec rubis être passe par -value lorsque vous êtes après une liste de valeurs de retour.

E.g.

:linenum > (a,b,c) = [1,2,3] 
:linenum > a 
    => 1 
:linenum > b 
    => 2 
:linenum > c 
    => 3 
2

Vous pouvez faire quelque chose avec destructuration similaire:

def something((a, b)) 
    a + b 
end 

p something([1, 2]) 

Cette imprime 3 comme prévu.

7

Je suis l'auteur de Gem for Ruby tuples.

Vous disposez de deux classes:

  • Tuple en général
  • Pair en particulier

Vous pouvez les initialiser de différentes manières:

Tuple.new(1, 2) 
Tuple.new([1, 2]) 
Tuple(1, 2) 
Tuple([1, 2]) 
Tuple[1, 2] 

Les deux les classes ont des méthodes auxiliaires:

  • length/arity - qui renvoie nombre de valeurs à l'intérieur de tuple
  • first/last/second (seule paire) - qui renvoie un des éléments correspondants
  • [] qui vous donne un accès à l'un des éléments particuliers
0

Vous pouvez railler Scala tUPLES avec cette astuce:

Tuple = Struct.new(:_1, :_2) 

2.2.5 :003 > t = Tuple.new("a", "b") 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :004 > t._1 
=> "a" 
2.2.5 :005 > t._2 
=> "b" 

mais ici vous ne pouvez pas avoir destructuration:

2.2.5 :012 > a, b = t 
=> {:_1=>"a", :_2=>"b"} 
2.2.5 :013 > a 
=> {:_1=>"a", :_2=>"b"} 
2.2.5 :014 > b 
=> nil 

Mais grâce à cette astuce: https://gist.github.com/stevecj/9ace6a70370f6d1a1511 destructuration fonctionnera:

2.2.5 :001 > Tuple = Struct.new(:_1, :_2) 
=> Tuple 
2.2.5 :002 > t = Tuple.new("a", "b") 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :003 > t._1 
=> "a" 
2.2.5 :004 > class Tuple ; def to_ary ; to_a ; end ; end 
=> :to_ary 
2.2.5 :005 > a, b = t 
=> #<struct Tuple _1="a", _2="b"> 
2.2.5 :006 > a 
=> "a" 
2.2.5 :007 > b 
=> "b" 
Questions connexes