Ruby es un lenguaje:[editar]
- 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:[editar]
- 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:[editar]
- 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[editar]
- 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[editar]
- 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[editar]
- Las cadenas se manejan de forma muy sencilla
- Si se usan comillas dobles se interpretan carateres de escape y expresiones de evaluación
- 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[editar]
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
- 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