intro a ruby

35
Ruby Lenguajes de Programación

Upload: armando-rob

Post on 29-Jan-2015

972 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Intro a ruby

Ruby

Lenguajes de Programación

Page 2: Intro a ruby

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.

Page 3: Intro a ruby

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

Page 4: Intro a ruby

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.

Page 5: Intro a ruby

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"}

Page 6: Intro a ruby

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

Page 7: Intro a ruby

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 ) ]

Page 8: Intro a ruby

Arrays

•Creación de un arreglo def hello return "hello world" end x = [1+2, hello, `ver`]

Page 9: Intro a ruby

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]

Page 10: Intro a ruby

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

Page 11: Intro a ruby

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}

Page 12: Intro a ruby

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

Page 13: Intro a ruby

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

Page 14: Intro a ruby

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

Page 15: Intro a ruby

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

Page 16: Intro a ruby

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

Page 17: Intro a ruby

Algunos métodos de la clase enum que trabajan con bloques•each•collect•find

Page 18: Intro a ruby

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"

Page 19: Intro a ruby

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

Page 20: Intro a ruby

Expresiones Regulares

"Escuela"=~/cue/"Escuela"=~/^c/"Escuela"=~/^E/ "1011100"=~/1(0|1)*00/

Page 21: Intro a ruby

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.

Page 22: Intro a ruby

Expresiones RegularesDir.entries('C:\\').find {|archivo| archivo.match('htm') }=> "DocProyect.html"

Dir.entries('C:\\').find {|archivo| archivo=~/.*ht.*|.*[0-9].*/ } => "DocProyect.html"=> "11MejObrasMusiClasica"

Page 23: Intro a ruby

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"]]

Page 24: Intro a ruby

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"]]

Page 25: Intro a ruby

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

Page 26: Intro a ruby

Clases

Page 27: Intro a ruby

Herencia

Page 28: Intro a ruby

Superclasesx = 6.classbegin x = x.superclass

puts(x) end until x == Object =>FixnumIntegerNumericObjectnil

Page 29: Intro a ruby

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

Page 30: Intro a ruby

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

Page 31: Intro a ruby

Manejo de Excepciones

•Exception Class▫StandardError

ZeroDivisionError NameError

NoMethodError IOError

EOFError TypeError

▫Fatal

Page 32: Intro a ruby

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

Page 33: Intro a ruby

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

Page 34: Intro a ruby

Ancestros de una excepción

beginx = 1/0

rescue Exception => excx = 0puts( exc )puts( "Family Tree of this exception..." )showFamily( exc.class )

end

Page 35: Intro a ruby

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