Muchas gracias a todos por la distinas expliaciones que fueron concisas y
sencillas (cortitas y al pie).
Lo entendí a la perfección.
Saludos,
Juan.
On 6/14/07, Emmanuel Oga <[EMAIL PROTECTED]> wrote:
Que tal Juan. La mejor explicacion para << es mirar la documentacion de
ruby. Podes hacerlo asi (si instalaste ruby en tu sistema y tenes linea de
comando)
ri Array
Y te tira una descripcion de la clase Array, sus metodos de instancia, su
metodos de clase, etc...
En este caso te interesa concer array porque el operador "<<" esta
aplicado sobre un array:
registros= [] # Es casi lo mismo que decir "registros= Array.new"
Parti la declaracion en tres pasos. Algo como esto
# paso 1: el elemento que quiero guardar en el array.
elemento= Estructura.*new*(linea[*0* ..*30*].strip, *linea[*31*..-*1 *]
.split)
# paso 2: Solo guardo el elemento en el array si se cumple la condicion
if linea.size == 106
# paso 3:
# los array de ruby permiten guardar casi "cualquier cosa"
# A diferencia de Java, los arrays de ruby guardan valores genericos de
manera
# natural, sin necesidad de sintaxis extra.
registros << (elemento)
end
Algunas aclaraciones:
Decir "a= []; a << 1;" es lo mismo que decir "a= Array.new; a.<< 1"
(fijate el punto). Por lo tanto lo que estas haciendo es invocando el metodo
<< del objeto "a", objeto de clase "Array".
Decir
if condition then
something;
end
es casi lo mismo que decir
something if condition.
Le dicen algo asi como inversion de control, es una caracteristica
inspirada en perl y hace mas "linda" la sintaxis, nada mas.
Por ultimo,
*linea[*31*..-*1 *].split
Aca linea es un string. hace en tu linea de comando "ri String"
"ri String.slice": linea[31..-1] devuelve el "pedazo" de la cadena desde
el caracter 31 hasta el final de la cadena
"ri String.split": el metodo split parte la cadena cada vez que encuentra,
por defecto, un espacio. Devuelve un array de cadenas.
*linea[*31*..-*1 *].split: acordate, split devuelve un array. De manera
que lo siguiente se lee mas facil asi: *(linea[*31*..-*1 *].split). El
operador * delante de un array convierte cada valor del array en una lista
de parametros. Ejemplo
def mimetodo(uno, dos, tres)
puts "#{uno}, #{dos}, #{tres}"
end
a= [1, 2, 3]
mimetodo(a) # Error! necesito tres parametros
mimetodo(*a) # Ok, interpreta *a como a[0], a[1], a[2]
Para una explicacion mucho mas detallada y correctosa, conseguite el
pickaxe (es un libro) :)
Esta es la version vieja: http://whytheluckystiff.net/ruby/pickaxe/
*Juan Roperto <[EMAIL PROTECTED]>* escribió:
Antes que nada: Hola!!!
Hace menos de un mes que me subscribí a la lista y me gusta mucho Ruby y
Ruby on Rails.
Tuve un par de clases en la facultad sobre Ruby y me gusto mucho el
lenguaje desde el principio (vengo de Java).
Viendo los códigos de Fernando y Emmanuel encontré cosas que no conozco o
no comprendo. Precisamente lo siguiente:
- registros << Estructura.*new*(linea[*0* ..*30*].strip, *linea[*31*
..-*1 *].split) if linea.size == 106
En la mayoría de los lenguajes el << se utiliza para "shifteo". ¿en
Ruby también?¿Cómo funciona?
¿Para que sirve el * antes del arreglo?
Muchas gracias de antemano por su respuesta y disculpen por el off-topic.
Saludos,
Juan.
On 6/14/07, Emmanuel Oga <[EMAIL PROTECTED]> wrote:
>
> No lo he probado, pero investiga algo como esto:
>
> registros= []
>
> IO.foreach("nombre_archivo.txt") do |line| #Lee cada linea del archivo
> registros << Estructura.*new*(linea[*0* ..*30*].strip, *linea[*31*
> ..-*1* ].split) if linea.size == 106
> end
>
> Los llamados "one liners" estan ok, pero no te olvides de que existen
> los "procedimientos" (en el caso de ruby son métodos pertenecientes a un
> objeto global generado con la clase "Object"). Creo que estructurandolo asi
> es mas facil de entender lo que queres hacer:
>
> registros= []
> def procesar(linea)
> # ... hace lo que quieras con la linea, ej:
> registros << Estructura.*new*(linea[* 0*..*30*].strip, *linea[*31*..-
> * 1*].split)
> end
>
> IO.foreach("nombre_archivo.txt") do |line| #Lee cada linea del archivo
> procesar(linea) if linea.size == 106
> end
>
> Emmanuel
>
> *Fernando Castañeda <[EMAIL PROTECTED]>* escribió:
>
> Una consulta de como implementar que la linea que voy evaluando al
> abrir el archivo tenga una longitud de 106 caracteres o en su defecto que se
> salteé en el procesamiento las 3 primeras lineas del archivo ya que las
> mismas corresponden a encabezados que no son tenidos en cuenta.
> No me funciona este bloque, ya que pasa y me da error al mapear con el
> Struct cuando no tiene el contenido que espera. Registros =
> File.open('c:/vts/txt/dos.txt').map {|linea| *if* linea.length >= *106*then
Estructura.
> * new*(linea[*0*..* 30*].strip, *linea[*31*..-* 1*].split) *end*}
>
> Muchas gracias nuevamente.
>
> Fernando Castañeda.
> www.inidep.edu.ar
>
> Codigo que vengo testeando
>
> class Movimiento
> attr_writer *:nombre* , *:matricula*
> attr_reader *:nombre* , *:matricula *
> * def* initialize(nombre, matricula)
> * @nombre* = nombre
> * @matricula* = matricula
> end
> end
>
> miarray=Array.*new*
> Estructura = Struct.*new*(*:barco* , *:matricula*, *:latitud* , *:ems*,
> *:a0* , *:a1*, *:a2* , *:a3*, *:a4* , *:a5*, *:a6*, *:a7*, *:a8*, *:a9*)
> #Registros = File.open('c:/vts/txt/d.txt').map {|linea| puts linea.size
> }
> Registros = File.open( 'c:/vts/txt/dos.txt').map {|linea| *if*
> linea.length = * 106* then Estructura.*new*(linea[* 0*..*30*].strip,
> *linea[* 31*..-*1*].split) * end*}
> Registros.*each*{|x| miarray << Movimiento.* new*(x.barco, x.matricula)
> }
> miarray.*each* {|y| puts y.matricula+" "+y.nombre}
> miarray.map {|item| puts item.matricula+" "+item.nombre }
>
>
> _______________________________________________
> ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
>
> ------------------------------
> *Preguntá. Respondé. Descubrí.*
> Todo lo que querías saber, y lo que ni imaginabas,
> está en *Yahoo! Respuestas* (Beta).
> *¡Probalo ya! <http://ar.answers.yahoo.com>*
>
> _______________________________________________
> 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
------------------------------
*Preguntá. Respondé. Descubrí.*
Todo lo que querías saber, y lo que ni imaginabas,
está en *Yahoo! Respuestas* (Beta).
*¡Probalo ya! <http://ar.answers.yahoo.com>*
_______________________________________________
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