Ruby Lenguajes de Programación. Características de Ruby Interpretado Ruby es el lenguaje...

Post on 09-Jan-2015

14 views 1 download

Transcript of Ruby Lenguajes de Programación. Características de Ruby Interpretado Ruby es el lenguaje...

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