2. Características de Ruby
• Interpretado
▫ Ruby es el lenguaje interpretado, por lo que no tiene que volver a
compilar para ejecutar un programa escrito en Ruby.
• Las variables no tienen ningún tipo (tipeo dinámico)
▫ Variables en Ruby pueden contener datos de cualquier
tipo. Usted no tiene que preocuparse sobre cómo escribir
variables. Por consiguiente, es débil en la verificación en tiempo
de compilación.
• No necesita declaración
▫ Usted puede utilizar variables en sus programas sin ningún tipo
de declaraciones de Ruby. Los nombres de las variables denotan
su ámbito de aplicación (local, global, etc)
• Sintaxis simple
▫ Ruby tiene una sintaxis simple ligeramente influenciada por
Eiffel.
3. Características de Ruby
• Gestión Automática de Memoria
▫ Recolección de Basura
• Todo es un objeto
▫ Ruby es un lenguaje de orientación a objetos pura. Incluso
los datos básicos como enteros son tratados como objetos
de manera uniforme.
• Clase, herencia, métodos
▫ Por supuesto, como un lenguaje OO, Ruby tiene
características como las clases, herencia, métodos, etc. No
maneja herencia múltiple
• Dinámico
▫ Puede ser modificado en tiempo de ejecución
4. Características de Ruby
• Iteradores
▫ Ruby tiene iteradores para construcción de lazos.
• Bloques
▫ Permiten hacer porciones de código que son objetos.
• Tratamiento de textos y de expresiones
regulares
• Bignums
▫ Con built-in bignums, se puede calcular factoriales (400), por
ejemplo.
• El manejo de excepciones
▫ Como en Java
• Acceso directo al SO
▫ Puede ser utilizado en la programación del sistema.
5. Clase Range
• Clase Range (Rango)
▫ Describe un intervalo
▫ (1..20)
▫ (“a”..”m”)
▫ Cuando se usa tres punto, el número de la
derecha no se incluye. Ej: (1…10)
• Método each
▫ Para cada elemento del rango, ejecuta lo que
contiene el bloque adjunto
▫ (1..20).each {|i| print i*i, "n"}
6. Range
• También está soportada la iteración al estilo
tradicional
for i in (1..10) do
puts( i )
end
• Cambiar un rango a arreglo:
mi_rango.to_a
devuelve un arreglo, con los mismos elementos de
rango
7. Arrays
• Arreglos
▫ Un arreglo es una colección secuencial de
referencias a objetos, cada una ocupará una
posición, identificada con un índic entero no
negativo. A diferencia de otros lenguajes, un
arreglo puede tener items que pertenecen a
distintos tipos de datos. Ej:
a1 = [1,'two', 3.0, array_length( a0 ) ]
8. Arrays
• Creación de un arreglo
def hello
return "hello world"
end
x = [1+2, hello, `ver`]
10. Hashes
• Tambien se los conoce como arreglos asociativos
o diccionarios.
• Son similares a los arreglos, en el sentido que es
una colección indexada de referencias a objetos
• Sin embargo, mientras que los arreglos se
indexan con un entero, los hash se pueden
indexar con objetos de cualquier tipo
• Al almacenar un Hash, deberá suplir 2 objetos:
la clave y el valor
12. Bloques
• Un bloque puede aparecer en el código
adyacente a la llamada a un método, escrito
como ultimo parámetro del método
• El código del bloque no es ejecutado
inmediatamente al ser encontrado. En cambio
Ruby recuerda el contexto en el cual el bloque
aparece y entonces llama al método
14. Yield
• Dentro del método, la sentencia yield invocará
al bloque, como si se tratara de algún método
• Cuando yield es ejecutado, invoca al código del
bloque
• Cuando el bloque finaliza, el control regresa
inmediatamente a la línea después del yield
15. Argumentos de bloques
• En el bloque, el argumento aparece entre barras
verticales.Es aquí donde se recibe los valores
pasados a yield
• Aunque es común pasar sólo un valor al bloque,
se pueden tambien pasar más de un valor
16. Bloques
• El bloque tambien puede retornar un valor al
método, a través de yield: yield toma el valor de
la última expresión evaluada en el bloque
17. Algunos métodos de la clase enum que
trabajan con bloques
• each
• collect
• find
19. Que valor retornan las expresiones de
abajo?
f=3
begin
if f==1 then f=12 else f==h end
end
⇒“h“
f=3
begin
if f==1 then f=12 else puts(“prueba”) end
End
=>nil
21. Expresiones Regulares
Cualquier carácter, excepto /^$|.+*?()[]{}, hace match
con si mismo.
^ match con el inicio de una línea,
$ match con el fin de una línea.
. Match con cualquier caracter.
a* cero o más repeticiones de a.
a+ equivalente a aa*.
a|b hace match a a or b.
[characters] Hace Match con un rango de caracteres.
Ej:
[a-zA-Z0-9] hace match a caracteres o alfanuméricos
[^characters] Hace Match a la negación de un rango de
caracteres. Ejemplo: [^a-zA-Z0-9] hace match con
todos los caracteres que NO son alfanuméricos.
24. Ejemplo. En base al arreglo anterior, obtener un
arreglo, donde cada elemento es a su vez un
arreglo con 2 elementos, formados de tomar
cada elemento de la cadena, separados por “;”
irb(main):002:0> arr.map { |a| a.chomp.split(";")}
=> [["123", "1+2"], ["58+78", "47"], ["12", "1+1"],
["*3", "*1"], ["*6", "*2"], ["*2", "*10"], ["*2", "as"],
["*2", "12"], ["70", "*1"], ["*4", "*5"], ["78", "*4"],
["78", "*13"], ["78", "*as"], ["*13", "*17"], ["*15",
"*2"], ["*16", "*1"]]
29. Superclases
Función recursiva que muestra todos los ancestros de una
clase dada
def showFamily( aClass )
if (aClass != nil) then
puts(aClass)
showFamily( aClass.superclass )
end
end
30. Manejo de Excepciones
• Básicamente, podemos manejar excepciones de la
siguiente manera:
Begin
# Algún código que podría causar una excepción
rescue <Exception Class>
# Código para recuperarse de una excepción
end
<Exception Class> puede ser la clase Exception, o una
de sus descendientes
32. rescueException=>
def calc( val1, val2 )
begin
result = val1 / val2
rescue Exception => e # e va a referenciar a una instancia de Exception
puts( e.class ) # Visualizo la clase del objeto e
puts( e ) # Muestra la descripción del objeto e
result = nil
end
return result
end
33. Manejando errores específicos
def calc( val1, val2 )
begin
result = val1 / val2
rescue TypeError, NoMethodError => e
puts( e.class )
puts( e )
puts( "One of the values is not a number!" )
result = nil
rescue Exception => e
puts( e.class )
puts( e )
result = nil
end
return result
end
34. Ancestros de una excepción
begin
x = 1/0
rescue Exception => exc
x = 0
puts( exc )
puts( "Family Tree of this exception..." )
showFamily( exc.class )
end
35. Else-ensure
def doCalc( aNum )
begin
result = 100 / aNum.to_i
rescue Exception => e
result = 0
msg = "Error: " + e
else
msg = "Result = #{result}"
ensure
msg = "You entered '#{aNum}'. " + msg
end
return msg
end