Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: rubyestaroto en 11 Diciembre 2013, 16:05 pm



Título: Dudilla ruby
Publicado por: rubyestaroto en 11 Diciembre 2013, 16:05 pm
Hola a todos, estoy empezando a aprender este lenguaje y tenía una duda respecto a los iteradores.
Supongamos que tenemos la siguiente clase:
Código
  1. class Colegio
  2.  
  3. def initialize()
  4.  @arrayAlumnos=[]
  5.  @arrayProfesores=[]
  6.  @arrayAsignaturas=[]
  7. end
  8.  
  9. end

Mi duda era como podría crear un iterador (each por ejemplo) que solo iterase ante un determinado array (que es un atributo/variable de la clase), por ejemplo eachAlumnos() {| x | puts x} iterararía solo sobre los alumnos y para llamarlo se pondría eachAlumnos(){ ... } y no @arrayAlumnos.each() {...} como haríamos con un iterador normal.


Muchas gracias por todo de antemano. Saludos!!!


Título: Re: Dudilla ruby
Publicado por: Shell Root en 11 Diciembre 2013, 16:38 pm
No entendí un carajo! jjajjaa


Título: Re: Dudilla ruby
Publicado por: Eleкtro en 11 Diciembre 2013, 17:13 pm
y para llamarlo se pondría eachAlumnos(){ ... } y no @arrayAlumnos.each() {...} como haríamos con un iterador normal.

Hola,
No me ha quedado claro si tu intención es reinventar la rueda de un For Each de forma universal?, o crear varios métodos distintos PREDEFINIDOS para esa Class para que simulen un For Each.
¿se trata sólamente de hacer lo mismo pero escribiendo (un poco) menos? xD

En mi opinión si "eachALGO" pretendes hacerlo genérico no tiene ni pies ni cabeza pues .each es una extensión de una Colección mientras que eachALGO no es nada y no podría ser lo mismo puesto que no puedes aplicarlo a ningún objeto, no sería un método de un objecto, sería un método, sin más, entonces no podrías utilizarlo de forma dinámica.

Aunque hace mucho que no programo en Ruby pero está claro que en un lenguaje ni usando Lambdas ni magia podrías instanciar métodos de forma dinámica de la manera en la que lo has planteado símplemente escribiendo "eachLOQUESEA" y que el método se crease por si solo, no, yo pienso que la única solución sería crear tu mismo los métodos necesarios (eachAlumnos() eachLoquesea()) cada uno por separado, con su nombre de método y sus instrucciones preestablecidas por ti dentro del Script, claro, y que cada método hiciese un For Each, es decir, creas el método "eachALUMNOS" y haces un .each en el array que tú, préviamente, hayas declarado en las órdenes de dicho método.

Saludos!

Edito: O bien podrías hacer algo parecido a este método :

Código
  1. # -*- coding: UTF-8 -*-
  2.  
  3. days = [ "Monday",
  4.         "Tuesday",
  5.         "Wednesday",
  6.         "Thursday",
  7.         "Friday",
  8.         "Saturday",
  9.         "Sunday"
  10.       ]
  11.  
  12. def each(collection, &procedure)
  13.  procedure.call(collection)
  14. end
  15.  
  16. each(days) {|var|print var}
  17.  
  18. sleep 5
  19. Process.exit
  20.  
  21. __END__

Saludos