Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare una empresa de Scribd logo
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, ""}
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, &quot; &quot; } 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') } => &quot;DocProyect.html&quot;
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 &quot;Escuela&quot;=~/cue/ &quot;Escuela&quot;=~/^c/ &quot;Escuela&quot;=~/^E/ &quot;1011100&quot;=~/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') } => &quot;DocProyect.html&quot; Dir.entries('C:').find {|archivo| archivo=~/.*ht.*|.*[0-9].*/ }  => &quot;DocProyect.html&quot; => &quot;11MejObrasMusiClasica&quot;
Ejemplo de lectura de archivo irb(main):001:0> arr = IO.readlines(&quot;abrir.txt&quot;) [&quot;123;1+2&quot;, &quot;58+78;47&quot;, &quot;12;1+1&quot;, &quot;*3;*1&quot;, &quot;*6;*2&quot;, &quot;*2;*10&quot;, &quot;*2;as&quot;, &quot;*2;12&quot;, &quot;70;*1&quot;, &quot;*4;*5&quot;, &quot;78;*4&quot;, &quot;78;*13&quot;, &quot;78;*as&quot;, &quot;*13;*17&quot;, &quot;*15;*2&quot;, &quot;*16;*1&quot;] Arr.map  es lo mismo que arr.collect irb(main):002:0> arr.map { |a| a.chomp.split(&quot;;&quot;)} => [[&quot;123&quot;, &quot;1+2&quot;], [&quot;58+78&quot;, &quot;47&quot;], [&quot;12&quot;, &quot;1+1&quot;], [&quot;*3&quot;, &quot;*1&quot;], [&quot;*6&quot;, &quot;*2&quot;], [&quot;*2&quot;, &quot;*10&quot;], [&quot;*2&quot;, &quot;as&quot;], [&quot;*2&quot;, &quot;12&quot;], [&quot;70&quot;, &quot;*1&quot;], [&quot;*4&quot;, &quot;*5&quot;], [&quot;78&quot;, &quot;*4&quot;], [&quot;78&quot;, &quot;*13&quot;], [&quot;78&quot;, &quot;*as&quot;], [&quot;*13&quot;, &quot;*17&quot;], [&quot;*15&quot;, &quot;*2&quot;], [&quot;*16&quot;, &quot;*1&quot;]]
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(&quot;;&quot;)} => [[&quot;123&quot;, &quot;1+2&quot;], [&quot;58+78&quot;, &quot;47&quot;], [&quot;12&quot;, &quot;1+1&quot;], [&quot;*3&quot;, &quot;*1&quot;], [&quot;*6&quot;, &quot;*2&quot;], [&quot;*2&quot;, &quot;*10&quot;], [&quot;*2&quot;, &quot;as&quot;], [&quot;*2&quot;, &quot;12&quot;], [&quot;70&quot;, &quot;*1&quot;], [&quot;*4&quot;, &quot;*5&quot;], [&quot;78&quot;, &quot;*4&quot;], [&quot;78&quot;, &quot;*13&quot;], [&quot;78&quot;, &quot;*as&quot;], [&quot;*13&quot;, &quot;*17&quot;], [&quot;*15&quot;, &quot;*2&quot;], [&quot;*16&quot;, &quot;*1&quot;]]
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
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( &quot;One of the values is not a number!&quot; ) 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( &quot;Family Tree of this exception...&quot; ) showFamily( exc.class ) end
Else-ensure def doCalc( aNum ) begin result = 100 / aNum.to_i rescue Exception => e result = 0 msg = &quot;Error: &quot; + e else msg = &quot;Result = #{result}&quot; ensure msg = &quot;You entered '#{aNum}'. &quot; + msg end return msg end

Más contenido relacionado

Intro a ruby

  • 1. Ruby Lenguajes de Programación
  • 2. 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.
  • 3. 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
  • 4. 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.
  • 5. 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, &quot;&quot;}
  • 6. 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
  • 7. 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 ) ]
  • 8. Arrays Creación de un arreglo def hello return &quot;hello world&quot; end x = [1+2, hello, `ver`]
  • 9. 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]
  • 10. 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
  • 11. Hashes Ejemplo h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' } h.length » 3 h['dog'] » &quot;canine“ h['cow'] = 'bovine‘ h[12]    = 'dodecine‘ h['cat'] = 99 h » {&quot;donkey&quot;=>&quot;asinine&quot;, &quot;cow&quot;=>&quot;bovine&quot;,  &quot;dog&quot;=>&quot;canine&quot;, 12=>&quot;dodecine&quot;, &quot;cat&quot;=>99}
  • 12. 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
  • 13. 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, &quot; &quot; } Resultado: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. Algunos métodos de la clase enum que trabajan con bloques each collect find
  • 18. 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') } => &quot;DocProyect.html&quot;
  • 19. 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
  • 20. Expresiones Regulares &quot;Escuela&quot;=~/cue/ &quot;Escuela&quot;=~/^c/ &quot;Escuela&quot;=~/^E/ &quot;1011100&quot;=~/1(0|1)*00/
  • 21. 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.
  • 22. Expresiones Regulares Dir.entries('C:').find {|archivo| archivo.match('htm') } => &quot;DocProyect.html&quot; Dir.entries('C:').find {|archivo| archivo=~/.*ht.*|.*[0-9].*/ } => &quot;DocProyect.html&quot; => &quot;11MejObrasMusiClasica&quot;
  • 23. Ejemplo de lectura de archivo irb(main):001:0> arr = IO.readlines(&quot;abrir.txt&quot;) [&quot;123;1+2&quot;, &quot;58+78;47&quot;, &quot;12;1+1&quot;, &quot;*3;*1&quot;, &quot;*6;*2&quot;, &quot;*2;*10&quot;, &quot;*2;as&quot;, &quot;*2;12&quot;, &quot;70;*1&quot;, &quot;*4;*5&quot;, &quot;78;*4&quot;, &quot;78;*13&quot;, &quot;78;*as&quot;, &quot;*13;*17&quot;, &quot;*15;*2&quot;, &quot;*16;*1&quot;] Arr.map es lo mismo que arr.collect irb(main):002:0> arr.map { |a| a.chomp.split(&quot;;&quot;)} => [[&quot;123&quot;, &quot;1+2&quot;], [&quot;58+78&quot;, &quot;47&quot;], [&quot;12&quot;, &quot;1+1&quot;], [&quot;*3&quot;, &quot;*1&quot;], [&quot;*6&quot;, &quot;*2&quot;], [&quot;*2&quot;, &quot;*10&quot;], [&quot;*2&quot;, &quot;as&quot;], [&quot;*2&quot;, &quot;12&quot;], [&quot;70&quot;, &quot;*1&quot;], [&quot;*4&quot;, &quot;*5&quot;], [&quot;78&quot;, &quot;*4&quot;], [&quot;78&quot;, &quot;*13&quot;], [&quot;78&quot;, &quot;*as&quot;], [&quot;*13&quot;, &quot;*17&quot;], [&quot;*15&quot;, &quot;*2&quot;], [&quot;*16&quot;, &quot;*1&quot;]]
  • 24. 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(&quot;;&quot;)} => [[&quot;123&quot;, &quot;1+2&quot;], [&quot;58+78&quot;, &quot;47&quot;], [&quot;12&quot;, &quot;1+1&quot;], [&quot;*3&quot;, &quot;*1&quot;], [&quot;*6&quot;, &quot;*2&quot;], [&quot;*2&quot;, &quot;*10&quot;], [&quot;*2&quot;, &quot;as&quot;], [&quot;*2&quot;, &quot;12&quot;], [&quot;70&quot;, &quot;*1&quot;], [&quot;*4&quot;, &quot;*5&quot;], [&quot;78&quot;, &quot;*4&quot;], [&quot;78&quot;, &quot;*13&quot;], [&quot;78&quot;, &quot;*as&quot;], [&quot;*13&quot;, &quot;*17&quot;], [&quot;*15&quot;, &quot;*2&quot;], [&quot;*16&quot;, &quot;*1&quot;]]
  • 25. 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
  • 28. Superclases x = 6.class begin x = x.superclass puts(x) end until x == Object =>Fixnum Integer Numeric Object nil
  • 29. 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
  • 30. 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
  • 31. Manejo de Excepciones Exception Class StandardError ZeroDivisionError NameError NoMethodError IOError EOFError TypeError Fatal
  • 32. 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
  • 33. Manejando errores específicos def calc( val1, val2 ) begin result = val1 / val2 rescue TypeError, NoMethodError => e puts( e.class ) puts( e ) puts( &quot;One of the values is not a number!&quot; ) result = nil rescue Exception => e puts( e.class ) puts( e ) result = nil end return result end
  • 34. Ancestros de una excepción begin x = 1/0 rescue Exception => exc x = 0 puts( exc ) puts( &quot;Family Tree of this exception...&quot; ) showFamily( exc.class ) end
  • 35. Else-ensure def doCalc( aNum ) begin result = 100 / aNum.to_i rescue Exception => e result = 0 msg = &quot;Error: &quot; + e else msg = &quot;Result = #{result}&quot; ensure msg = &quot;You entered '#{aNum}'. &quot; + msg end return msg end