2009-02-08 20 views
49

¿Alguien usa tuplas en Ruby? Si es así, ¿cómo se puede implementar una tupla? Los hashes de Ruby son agradables y funcionan casi igual de bien, pero realmente me gustaría ver algo como la clase Tuple en Python, donde puedes usar la notación . para encontrar el valor que estás buscando. Estoy queriendo esto para poder crear una implementación de D, similar a Dee para Python.¿Usando Tuples en Ruby?

+0

¿Alguna vez implemento D en Ruby? Si es así, ¿tienes el enlace? He estado trabajando en algo similar hace poco, y me encantaría ver lo que has hecho hasta ahora. – dkubb

+1

No; Nunca llegué tan lejos. He estado dando vueltas alrededor de varias otras cosas tratando de volver a eso. Encontré varias bibliotecas que parecen ayudar: LazyList y arel. Básicamente llegué a la conclusión de que LINQ en .NET estaba casi allí, luego encontré arel, que también estaba cerca. Usar LazyList y eliminar la conversión directa a SQL, la última de las cuales también es un objetivo del proyecto, casi te llevaría hasta allí. Dicho eso, me encantaría ver lo que tienes hasta ahora. Todavía estoy un poco lejos de volver a eso. –

+0

ambition es otra biblioteca de aspecto interesante, pero no se ha actualizado en algún momento. Ese fue el que encontré primero. arel parece que ha continuado en la misma tradición. –

Respuesta

44

OpenStruct?

breve ejemplo:

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

Eso es _exactly_ lo que estaba buscando. ¡Gracias! –

+2

np :) para responder su pregunta: no, yo no uso tuplas en ruby, como openstructs o de lo contrario. uso clases en el extremo alto y hash en el extremo bajo :) –

+9

esta es una respuesta pobre, ¿solo un enlace? ¿Seriamente? ¿Qué sucede si/cuando el enlace se rompe? –

25

Con base en el hecho de que se habla de valores hash y. notación Voy a suponer que te refieres a un tipo diferente de tupla que el tipo (1. "a"). Probablemente estés buscando la clase Struct. por ejemplo:

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

Eso está cerca, pero tener que nombrarlo me molesta. Estaba buscando algo como el tipo (1. "a") pero con la notación get/set de la propiedad que describes. –

+6

@panesofglass, no hay necesidad de nombrar nada: a = Struct.new (: name,: age) .new; a.name = "Guy" – paradoja

+0

¿Puedo establecer 'a = Struct.new (: name,: age)' y luego decir a.new? Supongo que sí. Tendré que verificarlo. Sería mucho más explícito en cuanto a lo que quiero. –

9

Si bien esto no es estrictamente una tupla (no se puede hacer la notación de puntos de los miembros), puede asignar una lista de variables de una lista, que a menudo va a resolver los problemas con el rubí siendo by-pass -valor cuando buscas una lista de valores devueltos.

E.g.

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

Usted puede hacer algo similar con la desestructuración:

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

p something([1, 2]) 

Esto muestra 3 como se esperaba.

7

Soy el autor de Gem for Ruby tuples.

Está provisto de dos clases:

  • Tuple en general
  • Pair en particular

Puede inicializar de diferentes maneras:

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

Tanto de la las clases tienen algunos métodos auxiliares:

  • length/arity - que devuelve número de valores dentro de tupla
  • first/last/second (sólo par) - que devuelve un elementos correspondientes
  • [] que proporciona un acceso a un elementos particulares
0

Puede burlarse de las tuplas de Scala con este truco:

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" 

pero aquí no se puede tener desestructuración:

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 

Pero gracias a este truco: https://gist.github.com/stevecj/9ace6a70370f6d1a1511 desestructuración funcionará:

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" 
Cuestiones relacionadas