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!
_______________________________________________
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! _______________________________________________
ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar