Martin:

Ademas del help de internet, podes pedirle ayuda a ruby con el comando "ri"

ri Hash 

si queres ver mas info de un metodo, pones

ri Clase.metodo o ri Clase#metodo

ri Hash.each

Los contenedores de ruby tienen la particularidad de iterarse de forma muy 
elegante, presta atencion a los metodos "each.." del contenedor que te 
interese. 

Hash tiene varios de estos metodos

Ejemplo
unhash= { :a => 1, :b => 2, :c => 3}
unhash.each do |key, value|
  puts "La clave #{key} contiene el valor #{value}
end

Un aspecto a tener en cuenta al hablar de contenedores en ruby tiene que ver 
con los mixins... 

Pensa en metodos que "flotan" en un namespace --modulo en ruby--, que podes 
incluir en cualquier clase que quieras --o incluso dentro de otro modulo. 
Aaarrhg! es dificil tratar de explicarlo en unas pocas lineas.... 

El tema es que los contenedores solo necesitan definir un metodo "each" que 
devuelva todos los elementos sucesivos que posee y un metodo "<=>" que permita 
compararlos para ganar toda la funcionalidad del modulo Enumerable (hace ri 
Enumerable).

En definitiva, una vez que entendes Enumerable te sirve para Hash, Array,, o 
hasta tus propias clases, si lo incluis de esta forma

class MiLindoContenedor
  include Enumerable

  def each 
    yield valor
  end

  def <=> otro
    self.valor.blablabla <=> otro.blablabla
  end

...
end
  


Martin Sagastume <[EMAIL PROTECTED]> escribió: Despues de haber hecho todo con 
listas para aprender como se usaban
las listas descubri como ver los metodos de la Clase Array =S

http://www.ruby-doc.org/core/classes/Array.html

No encontre en internet algun ejemplo que usara la clase Hash pero con
esta documentacion que parece ser el API entero

http://www.ruby-doc.org/core/

Veo que hay una clase Hash...voy a mirarlo bien..disculpen haber
mandado lo anterior, recien descubro esto de Core :P


On 8/31/07, Martin Sagastume  wrote:
> Provisoriamente tengo hecho el programa con una Lista lo cuál debo
> suplantar por un "HashMap" (vengo de Java) ...  no conozco nada de lo
> que ya tiene Ruby y empezar a mirar Modulo por Modulo o Clase por
> Clase debe ser un trabajo muy lindo :P  ...al hacerlo con Lista lo que
> hice fue incluir  la lista en una clase Sistema y ahi hacer los
> metodos que tendra programada la lista...les dejo la clase,
> seguramente muchos se rian porq programe los metodos bien caceros y
> buscar si una lista esta vacia en Ruby (q esta todo ya hecho) debe ser
> lista.empty?   o algo asi...pero como no se por donde empezar a
> buscar, me hice los metodos re caceros jeje aqui les dejo la clase
> Sistema asi se rien un poco ¬¬
>
> Sistema
> *********
>
> class Sistema
>
>
>   def getLista
>     return @lista
>   end
>
>   def agregarEnLista(elemento)
>     @lista << elemento
>   end
>
>   def agregarEnListaDupes(elemento)
>     @listaDupes << elemento
>   end
>
>   def estaEnLista(elemento)
>     ([EMAIL PROTECTED]).each do |i|
>       if @lista[i] == elemento
>         puts "ENCONTRE UN DUPPE!!"
>         self.agregarEnListaDupes(elemento)
>         return true
>       end
>     end
>     return false
>   end
>
>   def getListaDupes
>     return @listaDupes
>   end
>
>   def esVaciaLista
>     if @lista.length == 0
>       return true
>     end
>     return false
>   end
>
>   def mostrarLista
>     for i in ([EMAIL PROTECTED])
>       puts "Agregados a la lista: [EMAIL PROTECTED]"
>     end
>   end
>
>   def initialize
>     @lista           = Array.new
>     @listaDupes = Array.new
>   end
> end
>
>
> Necesito Utilizar HashMap en lugar de Lista para almacenar algo asi:
>
> -----KEY-----     ---------- VALUE ------------
> [d3daa1fc...  , /home/martin/archivo.txt]
>
> El tema es que mire en internet y hay poca documentación...vi que se
> creaba de la siguiente manera:
>
> hash = {} #creo el hash
> hash [md5] = "archivo1.txt" # ingreso elementos y clave al hash
>
> como recorro el hashmap ?
> como veo las operaciones que puedo realizarle a un HashMap..?? Ej..ver
> si esta vacio sin hacer mi propio metodo :P
>
> Estaba acostumbrado a q en Java HashMap es una clase...voy al API y
> veo que metodos tiene programados y listo..aca no se ni por donde
> empezar, estoy medio perdido aún...debe ser porque hace 3 días empezé
> a leer de Ruby :P
>
> Un tiempo estuve tratando de hacer cosas con RoR en lugar de PHP pero
> estuve muy poco tiempo ya que no entendia mucho y queria programar en
> RoR sin saber Ruby =P   ...ahora que ando con tiempo estoy lanzandome
> a aprender Ruby!!
>
>
> Gracias por la ayuda ;)
>
>
> On 8/31/07, NachoKB  wrote:
> > Está claro. Lo dije por que era muuuuuuuuuy simple (igual me gustó el
> > ejercicio).
> > Aunque más de una vez me pasó querer resolver algo y no encontrar cómo (o
> > sea, yo sabía la mejor forma pero no encontraba el nombre del método)...
> > recientemente, tenía un array de elementos (gnomos, digamos). Me interesaba
> > separar el gnomo emperador del resto para que una view los muestre por
> > separado. Yo buscaba una clasificación de elementos o algo así. Terminé
> > haciendo algo como
> >   emperador = gnomos.detect &:emperador?
> >   [ emperador, gnomos - emperador ]
> > Ayer me crucé con el método
> > Enumerable.partition*..........................................................
> >
> > * notar que no es exactamente lo mismo, pero eso era lo que buscaba en un
> > ppio... Ver
> > http://corelib.rubyonrails.org/classes/Enumerable.html#M002183
> >
> > nachokb
> >
> >
> > On 8/31/07, Emmanuel Oga < [EMAIL PROTECTED]> wrote:
> > >
> > > Deprimido? porque? Teniendo en cuenta el contexto asumo que es por no
> > conocer el uso recursivo del metodo glob de la clas Dir de la libreria core
> > de ruby... no? :)
> > >
> > > Bueno! creo que no tendrias que preocuparte mucho, si tenes en cuenta que
> > la libreria core y la libreria estandar de ruby comprenden decenas de
> > clases, cada una con decenas de metodos, dificilmente podrias conocer y
> > recordar de memoria el comportamiento exacto de cada uno de esos metodos.
> > Para mi la clave esta en compartir la info: lo que no se yo, alguien mas lo
> > sabra!!!
> > >
> > > :)
> > >
> > >
> > > NachoKB  escribió:
> > > Gracias!!
> > > Igual sigo deprimido...
> > >
> > >
> > > On 8/31/07, Emmanuel Oga  wrote:
> > > > Nacho:
> > > >
> > > > Dir.[] o Dir.glob toman como parametro un "glob pattern" (
> > http://en.wikipedia.org/wiki/Glob_pattern ) que es un
> > patron similar a una expresion regular pero menos poderoso que generalmente
> > se usa para describir archivos.
> > > >
> > > > El glob Dir[/directorio/**/*'] recorre todos los archivos en el
> > directorio "directorio" __Y__ sus subdirectorios, por lo que no hace falta
> > que lo implementes por tu cuenta. Otra cosa buena es que a Dir.[] le podes
> > pasar mas de un glob pattern si queres, ejemplo:
> > > >
> > > > Dir.glob ["/tmp/**/*", "/etc/**/*"].each do |file|
> > > > ...
> > > > end
> > > >
> > > > que busca todos los archivos en /tmp y sus subdirectorios __y__ todos
> > los archivos /etc y susu subdirectorios.
> > > >
> > > > NachoKB  escribió:
> > > >
> > > > Cuidado que Find no es una clase, sino un módulo.
> > > >
> > > > O sea, no es para usarlo directamente... normalmente es para
> > incorporarlo en una clase (para componer comportamiento). Lo mismo con
> > FileTest.
> > > >
> > > > Me parece que lo que querés hacer lo podés hacer sólo usando File y
> > Dir...
> > > >
> > > > Básicamente, vos querés agarrar todos los archivos a partir de un root
> > dado (recursivamente) y calcularle el MD5:
> > > >
> > > >
> > > > > Dir.new(directorio).map do |fullpath|
> > > > >   [name, Digest::MD5.hexdigest (File.read(fullpath))]
> > > > > end
> > > > >
> > > >
> > > > El problema es que (1) si bien Dir es Enumerable, enumera sólo los hijos
> > directo (no rescursivamente) y (2) "fullpath" no quedaría realmente el path
> > completo... Por lo tanto hice esto, ver qué opinan:
> > > >
> > > >
> > > > > class TraversableDir
> > > > >   include Enumerable
> > > > >   def initialize(*args, &block)
> > > > >     @dir = Dir.new *args, &block
> > > > >   end
> > > > >   def each(&block)
> > > > >     @dir.each do |name|
> > > > >       unless ['.', '..'].include? name
> > > > >         fullpath = self.fullpath(name)
> > > > >         case
> > > > >           when File.directory?(fullpath)
> > > > >             TraversableDir.new(fullpath).each &block
> > > > >           when File.file?(fullpath)
> > > > >             block.call fullpath
> > > > >           else
> > > > >             p "Ojo ni dir ni file: #{fullpath} (hay que hacer algo?)"
> > > > >         end
> > > > >       end
> > > > >     end
> > > > >   end
> > > > >   def fullpath(name)
> > > > >     File.expand_path "[EMAIL PROTECTED]/#{name}"
> > > > >   end
> > > > > end
> > > > >
> > > >
> > > > Entonces queda:
> > > >
> > > > > TraversableDir.new(directorio).map do |fullpath|
> > > > >   [name, Digest:: MD5.hexdigest (File.read(fullpath))]
> > > > > end
> > > > >
> > > >
> > > > Lo que te daria un array de esta forma:
> > > >
> > > > > [
> > > > >   [ "/path/a1", "ABDCE" ],
> > > > >   [ "/path/a2", "DEADBEEF" ]
> > > > > ]
> > > > >
> > > >
> > > > Que es un idiom usado en Ruby (es similar a un Hash pero a veces se usa
> > así, por ejemplo cuando no necesitás acceder a un elemento, sino que lo vas
> > a iterar).
> > > >
> > > >
> > > > On 8/31/07, Damian Janowski  wrote:
> > > > > On 8/31/07, Martin Sagastume < [EMAIL PROTECTED]> wrote:
> > > > > > Excelente, eso era lo que necesitaba...muchas gracias!!
> > > > > >
> > > > > > Estuve mirando si el "API" de Rails...creo que no vi eso :P  ..una
> > > > > > cosa que me llamó la atención es que la clase Find tenga programado
> > el
> > > > > > método find  ...como que es medio desprolijo el hecho de tener un
> > > > > > metodo que se llame igual que la clase (ya que en ruby no es el
> > > > > > constructor)  Buscar.buscar  en lugar de Buscador.buscar o algo asi
> > > > > > ...  es por algo en especial ?
> > > > >
> > > > > Nu sé :)
> > > > >
> > > > > Pero me parece que suele pasar con esas pequeñas funcionalidades que
> > > > > son casi "helper" y muchas veces quedan como métodos de clase, etc.
> > > > >
> > > > > Por ejemplo: Iconv.iconv
> > > > >
> > > > > Saludos!
> > > > > _______________________________________________
> > > > > Ruby mailing list
> > > > > [email protected]
> > > > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > > > >
> > > >
> > > > _______________________________________________
> > > > Ruby mailing list
> > > > [email protected]
> > > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > > >
> > > >
> > > >
> > > > ________________________________
> >
> > > > ¡Sé un mejor fotógrafo!
> > > > Perfeccioná tu técnica y encontrá las mejores fotos.
> > > > Visitá http://ar.yahoo.com/promos/mejorfotografo.html
> > > >
> > > > _______________________________________________
> > > > Ruby mailing list
> > > > [email protected]
> > > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > > >
> > > >
> > >
> > > _______________________________________________
> > > Ruby mailing list
> > > [email protected]
> > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > >
> > >
> > >
> > > ________________________________
> >
> > > ¡Sé un mejor fotógrafo!
> > > Perfeccioná tu técnica y encontrá las mejores fotos.
> > > Visitá http://ar.yahoo.com/promos/mejorfotografo.html
> > >
> > >
> > > _______________________________________________
> > > Ruby mailing list
> > > [email protected]
> > >
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> > >
> > >
> >
> >
> > _______________________________________________
> > Ruby mailing list
> > [email protected]
> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
> >
> >
>
>
> --
> Martín Sagastume
> 094-575846
> Montevideo - Uruguay
> http://musicapastillera.blogspot.com
>


-- 
Martín Sagastume
094-575846
Montevideo - Uruguay
http://musicapastillera.blogspot.com
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar


       
---------------------------------

¡Sé un mejor ambientalista!
Encontrá consejos para cuidar el lugar donde vivimos en:
http://ar.yahoo.com/promos/mejorambientalista.html
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a