Ruby Lenguajes de Programacin Caractersticas de Ruby Interpretado
Ruby Lenguajes de Programación
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.
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
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.
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"}
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
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: a 1 = [1, 'two', 3. 0, array_length( a 0 ) ]
Arrays • Creación de un arreglo def hello return "hello world" end x = [1+2, hello, `ver`]
Accediendo a un Arreglo a = [ 1, 3, 5, 7, 9 ] a[-1] » 9 a[-2] » 7 a[-99] a[1. . 3] a[1. . . 3] a[3. . 3] a[-3. . -1] » nil » [3, 5, 7] » [3, 5] » [7] » [5, 7, 9]
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
Hashes Ejemplo h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' } h. length » 3 h['dog'] » "canine“ h['cow'] = 'bovine‘ h[12] = 'dodecine‘ h['cat'] = 99 h » {"donkey"=>"asinine", "cow"=>"bovine", "dog"=>"canine", 12=>"dodecine", "cat"=>99}
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
Bloques def fib. Up. To(max) i 1, i 2 = 1, 1 # asignación en paralelo while i 1 <= max yield i 1, i 2 = i 2, i 1+i 2 end fib. Up. To(1000) { |f| print f, " " } Resultado: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
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
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
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
Algunos métodos de la clase enum que trabajan con bloques • each • collect • find
Ejemplo con find Dir. entries('C: \') Devuelve un Arreglo cuyos elementos son los nombres de archivo del directorio indicado. El siguiente ejemplo usa find, para encontrar el primer elemento del arreglo que cumple la condición: Dir. entries('C: \'). find {|archivo| archivo. match('htm') } => "Doc. Proyect. html"
Que valor retornan las expresiones de abajo? f=3 begin if f==1 then f=12 else f==h end Þ“h“ f=3 begin if f==1 then f=12 else puts(“prueba”) end End =>nil
Expresiones Regulares "Escuela"=~/cue/ "Escuela"=~/^c/ "Escuela"=~/^E/ "1011100"=~/1(0|1)*00/
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-z. A-Z 0 -9] hace match a caracteres o alfanuméricos [^characters] Hace Match a la negación de un rango de caracteres. Ejemplo: [^a-z. A-Z 0 -9] hace match con todos los caracteres que NO son alfanuméricos.
Expresiones Regulares Dir. entries('C: \'). find {|archivo| archivo. match('htm') } => "Doc. Proyect. html" Dir. entries('C: \'). find {|archivo| archivo=~/. *ht. *|. *[0 -9]. */ } => "Doc. Proyect. html" => "11 Mej. Obras. Musi. Clasica"
Ejemplo de lectura de archivo irb(main): 001: 0> arr = IO. readlines("abrir. txt") Þ["123; 1+2n", "58+78; 47n", "12; 1+1n", "*3; *1n", "*6; *2n", "*2; *10n", "*2; asn", "*2; 12n", "70; *1n", "*4; *5n", "78; *4n", "78; *13n", "78; *asn", "*13; *17n", "*15; *2n", "*16; *1n"] • Arr. map es lo mismo que arr. collect 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"]]
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"]]
Variables, constantes, símbolos • Variables / methods: student, i, epsilon, last_time • Constants: Old. Person, PDF_KEY, R 2 D 2 • Instance Variables: @name, @last_time, @maximum • Class Variables: @@lookup_table, @@instance • Global Variables: $global, $1, $count • Symbols: : name, : age, : Class
Clases
Herencia
Superclases x = 6. class begin x = x. superclass puts(x) end until x == Object =>Fixnum Integer Numeric Object nil
Superclases Función recursiva que muestra todos los ancestros de una clase dada def show. Family( a. Class ) if (a. Class != nil) then puts(a. Class) show. Family( a. Class. superclass ) end
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
Manejo de Excepciones • Exception Class ▫ Standard. Error Zero. Division. Error Name. Error No. Method. Error IOError EOFError Type. Error ▫ Fatal
rescue. Exception=> def calc( val 1, val 2 ) begin result = val 1 / val 2 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
Manejando errores específicos def calc( val 1, val 2 ) begin result = val 1 / val 2 rescue Type. Error, No. Method. Error => 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
Ancestros de una excepción begin x = 1/0 rescue Exception => exc x=0 puts( exc ) puts( "Family Tree of this exception. . . " ) show. Family( exc. class ) end
Else-ensure def do. Calc( a. Num ) begin result = 100 / a. Num. to_i rescue Exception => e result = 0 msg = "Error: " + e else msg = "Result = #{result}" ensure msg = "You entered '#{a. Num}'. " + msg end return msg end
- Slides: 35