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

Responder a