380 likes | 670 Views
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)
E N D
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: a1 = [1,'two', 3.0, array_length( a0 ) ]
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] » nil a[1..3] » [3, 5, 7] a[1...3] » [3, 5] a[3..3] » [7] a[-3..-1] » [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 fibUpTo(max) i1, i2 = 1, 1 # asignación en paralelo while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end fibUpTo(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') } => "DocProyect.html"
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
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-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.
Expresiones Regulares Dir.entries('C:\\').find {|archivo| archivo.match('htm') } => "DocProyect.html" Dir.entries('C:\\').find {|archivo| archivo=~/.*ht.*|.*[0-9].*/ } => "DocProyect.html" => "11MejObrasMusiClasica"
Ejemplo de lectura de archivo irb(main):001:0> arr = IO.readlines("abrir.txt") • ["123;1+2\n", "58+78;47\n", "12;1+1\n", "*3;*1\n", "*6;*2\n", "*2;*10\n", "*2;as\n", "*2;12\n", "70;*1\n", "*4;*5\n", "78;*4\n", "78;*13\n", "78;*as\n", "*13;*17\n", "*15;*2\n", "*16;*1\n"] • 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, dondecadaelementoes a suvez un arreglo con 2 elementos, formados de tomarcadaelemento de la cadena, separadospor “;” 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: OldPerson, PDF_KEY, R2D2 • Instance Variables: @name, @last_time, @maximum • Class Variables: @@lookup_table, @@instance • Global Variables: $global, $1, $count • Symbols: :name, :age, :Class
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 showFamily( aClass ) if (aClass != nil) then puts(aClass) showFamily( aClass.superclass ) end 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 • StandardError • ZeroDivisionError • NameError • NoMethodError • IOError • EOFError • TypeError • Fatal
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
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
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
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