Introducción a Ruby

De ChuWiki
Saltar a: navegación, buscar

Ruby es un lenguaje:

  • Orientado a Objetos
  • Interpretado
  • Sencillo
    • Definición de tipos en tiempo de ejecución
    • Sintaxis simple e intuitiva
    • ...
  • Potente
    • Expresiones regulares
    • Ficheros
    • Redes
    • ...

Podemos usar Ruby de varias formas:

  • Introduciendo las sentencias directamente desde la consola
c:\>ruby
print "Hola mundo"
CTRL-Z
Hola mundo
  • Ejecutando sentencias desde ficheros
c:\>ruby holaMundo.rb
  • La distribución de Ruby trae un eval.rb que permite la ejecución interactiva de sentencias
c:\>ruby eval.rb
ruby>print "Hola mundo"
Hola mundo
nil (esto es lo que devuelve el comando que se acaba de ejecutar)

Para empezar a jugar necesitamos:

  • El intérprete de Ruby [1] y un editor de textos
  • También existen diversos IDE's. Si eres fan de Eclipse puedes descargarte un plugin, en desarrollo, pero gratuito [2]

Ideas generales

  • Las sentencias se separan con ; o con LF
  • Se puede usar el backslash (\) para partir una linea
  • Para comentar se usa # o bloques =begin =end
  • Al ser interpretado, se desconoce código posterior a la linea de ejecución
    • No obstante, existen comandos para "incluir" otros ficheros:
      • include permite acceder a módulos
      • load copia el fichero que referencia en su lugar (como #include de C)
      • require carga el código una unica vez y cuando se necesite
  • Toda clase hereda implicitamente (si no se declara un padre) de Object
  • No es necesario destruir los objetos (tiene recolector de basura)
  • Si el objeto tiene declarado un método llamado initialize
    • Se invoca automaticamente al hacer un new del objeto
    • Se le pasan los argumentos con los que se invocó a new
  • self referencia al propio objeto
  • super referencia al padre del objeto
  • nil es la palabra reservada para indicar que un puntero no referencia nada
  • Los tipos se deciden dinamicamente y se pueden mezclar en arrays, hastables...
  • Los metodos se invocan: nombreObjeto.nombreMetodo(argumentos)
  • Si se declaran metodos sueltos se asignan automaticamente,como privados, a Object
  • Los ultimos argumentos pueden tener valores por defecto:
def metodoValoresDefecto(argumento1, argumento2=1,argumento3="3")
#cuerpo del método
end
  • Algunos ejemplos de clases
class Padre 
  def metodo1(argumento) 
    #si no se ejecuta return, se devuelve automaticamente el resultado 
    #de la ultima sentencia evaluada 
  end 
end 

#Un objeto de clase Padre se crea asi: 
Padre padre = Padre.new 
 
#Una clase que hereda de Padre
class Hijo<Padre 
  def metodo1(argumento) 
    super(argumento) 
  end 

  def metodoPrivado() 
    #cuerpo del metodo privado
  end 
  private:metodoPrivado 
end

Las variables

  • No es necesario
    • Especificar el tipo: se decide en ejecución
    • Declararlas antes de usarlas
  • Una variable global debe empezar por $
    • Se inicializan automaticamente a nil
    • Existen unas variables de sistema predefinidas
    • Definir un procedimiento que se invoque cuando se modifiquen es facil:
trace_var:$x,proc{print "$x vale ahora",$x,"\n"}
  • Un atributo de clase debe empezar por @
    • Se inicializan automaticamente a nil
    • Son todas privadas
  • Una variable local debe empezar por una letra minúscula o subrayado
    • No se inicializan automaticamente
    • Referenciar una no inicializada da error
  • Una constante debe empezar por una letra mayúscula
    • Son todas publicas
    • Se referencian clase::constante

Estructuras de datos

  • Las cadenas se manejan de forma muy sencilla
    • Si se usan comillas dobles se interpretan carateres de escape y expresiones de evaluación
      • print "a\nb #{5*3}"
        • a
        • b 15
    • Si se usan comillas simples la cadena contiene exactamente lo pasado entre las comillas
      • print 'a\nb #{5*3}'
      • a\nb #{5*3}
    • Son válidas operaciones como "hola"+"adios" (devuelve holaadios), "hola"*2 (devuelve holahola)
    • Se pueden usar indices para obtener caracteres de la cadena.Sea hola="hola"
      • hola[0] es h
      • hola[-1] es a
      • hola[1] es o
      • hola[1,1] es a
      • hola[-2,2] es la
      • hola[0..2] es hol
    • La igualdad de cadenas se comprueba directamente con ==
  • Los arrays pueden contener objetos de distinto tipo
    • array=[1,2,"cadena"]
    • Admiten las mismas operaciones descritas para las cadenas
    • array*2, array+[3,2,4], array[0,2], array[-2,2]...
    • Es posible realizar la transformación entre arrays y cadenas facilmente
    • array.join(':') genera una cadena del estilo 1:2:3
    • cadena.split(':') genera un array del estilo ["1","2","3"]
  • También hay tablas hash
    • hash = {"clave1"->"dato1",2=>"4"} es un ejemplo de declaracion
    • hash["clave1"] devolverá "dato1"
    • hash[5] devolverá nil
    • hash[5]=10 asigna un valor para la clave 5
    • hash[5]=nil borra el par (clave,valor) (5,10)

Estructuras de control

case i 
  when 1, 2..5 
    print "1..5\n" 
  when 6..10 
    print "6..10\n”
end
while ( condicion ) 
  #sale del bucle 
  break 
  
  #repite la presente iteración 
  redo 
  
  #salta a la siguiente iteración 
  next 
end
#El bucle for permite recorrer los elementos de una colección 
for num in (4..6) 
  #cuerpo del bucle
end 
#Si se quisiese comprobar que a está dentro de un rango: if a === (2..5) 
if a == 3 
  #haz esto 
else 
  #haz lo otro 
end

Más cosas

  • ARGV es un array con los parametros que se pasan en linea de comandos: ARGV[0].to_i intenta convertir el primer parametro a numero
  • STDIN es la entrada estandar y STDIN.gets lee hasta un final de linea
  • Algunos comandos acaban en ! o ? (por ejemplo chop!).
    • ! indica que la operación es peligrosa, es decir, modifica el original sobre el que actua
    • ? indica que la operacion ofrece un resultado booleano