View
973
Download
1
Category
Preview:
DESCRIPTION
Citation preview
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 Arregloa = [ 1, 3, 5, 7, 9 ]a[-1] » 9 a[-2] » 7a[-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
HashesEjemploh = { '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
Bloquesdef fibUpTo(max)
i1, i2 = 1, 1 # asignación en paralelowhile i1 <= max
yield i1 i1, i2 = i2, i1+i2 endend
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=3beginif f==1 then f=12 else f==h endend“h“f=3beginif f==1 then f=12 else puts(“prueba”) endEnd=>nil
Expresiones Regulares
"Escuela"=~/cue/"Escuela"=~/^c/"Escuela"=~/^E/ "1011100"=~/1(0|1)*00/
Expresiones RegularesCualquier 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 RegularesDir.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.collectirb(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: OldPerson, PDF_KEY, R2D2•Instance Variables: @name, @last_time,
@maximum•Class Variables: @@lookup_table,
@@instance•Global Variables: $global, $1, $count•Symbols: :name, :age, :Class
Clases
Herencia
Superclasesx = 6.classbegin x = x.superclass
puts(x) end until x == Object =>FixnumIntegerNumericObjectnil
SuperclasesFunción recursiva que muestra todos los ancestros
de una clase dada
def showFamily( aClass )if (aClass != nil) then
puts(aClass)showFamily( aClass.superclass )
endend
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 )
beginresult = 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 eresult = nil
endreturn result
end
Manejando errores específicosdef calc( val1, val2 )
beginresult = val1 / val2
rescue TypeError, NoMethodError => eputs( e.class )puts( e )puts( "One of the values is not a number!" )result = nil
rescue Exception => eputs( e.class )puts( e )result = nil
endreturn result
end
Ancestros de una excepción
beginx = 1/0
rescue Exception => excx = 0puts( exc )puts( "Family Tree of this exception..." )showFamily( exc.class )
end
Else-ensuredef doCalc( aNum )
beginresult = 100 / aNum.to_i
rescue Exception => eresult = 0msg = "Error: " + e
elsemsg = "Result = #{result}"
ensuremsg = "You entered '#{aNum}'. " + msg
endreturn msg
end
Recommended