SlideShare a Scribd company logo
1 of 25
DESARROLLO WEB
  AVANZADO
Desarrollo rápido con Ruby on Rails




                               Miguel Fernández Fernández
El lenguaje Ruby



http://www.ruby-doc.org/docs/ProgrammingRuby/
Ruby es un lenguaje...

           Orientado a objetos

                Dinámico

                Funcional



             Productivo
Ruby es Orientado a Objetos
No existen tipos primitivos. Todos los literales son objetos
 -199.abs                                              #   199
 "ruby no está nada mal".length                        #   21
 ["G", "A", "T", "T", "A", "C", "A"].uniq.sort.join    #   "ACGT"
 {:hielo=>"frío", :fuego=>"caliente"}.values           #   [“frío”,”caliente”]


El estado y comportamiento de los objetos se define a través
de clases
         class Punto
           attr_accessor :x,:y

           def initialize(x,y)
             @x=x
                                              origen=Punto.new(0,0)
             @y=y
                                              origen.x+=1 #igual que origen.x=origen.x+1
           end
                                              puts origen #=> Punto (1,0)
           def to_s
             "Punto (#{@x},#{@y})"
           end
         end
                                                                                 ruby_oo.rb
Ruby es dinámico

   No hay declaraciones explícitas de tipos
      lista=[1,2,3,"Hola"] #ruby
      List<? extends Object> lista= Arrays.asList(1,2,"Hola"); //java


   El tipo de los objetos viene determinado por su conjunto de
   métodos y no por la clase a la que pertenezca.*



*Duck typing: a way of thinking about ruby programming -             duck_typing.rb
 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502
Ruby es funcional
En ruby todas las funciones pueden recibir un bloque, que es
una función anónima.
   [1,2,3].map{ |x| x**2 } #[1, 4, 9]

   10.downto(1){ |x| puts x } # imprime los números del 10 al 1


Los bloques permiten parametrizar el comportamiento de la
función que la recibe (patrón Strategy)
   %w(ruby es ruby, no c++).sort do |una_palabra,otra_palabra|
     una_palabra.size - otra_palabra.size
   end #["no", "es", "c++", "ruby", "ruby,"]




                                                                  blocks.rb
                                                                  anonymous.java
Ruby es funcional
block_given? permite conocer si se ha pasado un bloque
a una función y yield permite invocarlo.
 class Array
   def filtra
                                                   [1,2,3,4].filtra do
     filtrados=[]
                                                     |elemento| elemento % 2 == 0
     if block_given?
                                                   end
       each do |elemento|
                                                   #=> [2,4]
         filtrados << elemento if yield elemento
       end
                                                   colores=%w{rojo amarillo azul verde}
       filtrados
                                                   %w{el cielo es azul}.filtra do
     else
                                                     |palabra| colores.member? palabra
       self
                                                   end
     end
                                                   #=>["azul"]
   end
 end




                                                                         blocks.rb
Ruby es un lenguaje productivo

El carácter dinámico y funcional del lenguaje, unido a una API
completa, hacen que el código sea más compacto y legible.


Ruby es reflectivo. El código puede ser observado y modificado
en tiempo de ejecución ➔ El propio programa puede crear
código por nosotros (metaprogramación)



                                                     reflection.rb
Core API (at a glance)

            Números

       Cadenas y Símbolos

   Rangos, Listas y Diccionarios

      Expresiones regulares



  http://www.ruby-doc.org/core/
Números (Numeric & sons.)
Tipos
         -123456   #Fixnum (negativo)
         123_456   #Fixnum (se ignora '_')
         .4        #Float
         2.3       #Float

Iteraciones
         3.times { print "X "}                        #=>   X X X
         6.upto(9){ |i| print i, " " if i % 2 == 0}   #=>   6 8
         99.downto(95) { |i| print i," "}             #=>   99 98 97 96 95
         50.step(80,5) { |i| print i," "}             #=>   50 55 60 65 70 75 80

Conversiones
         3.to_f            #=>   3.0
         -3.456_789.to_i   #=>   -3
         9.81.floor        #=>   9
         -0.21.floor       #=>   -1
         9.3.ceil          #=>   10
         9.5.round         #=>   10
         9.3.round         #=>   9
Cadenas (String)
A diferencia de la mayoría de los lenguajes de alto nivel, son
objetos mutables
# Comillas simples: no se evaluarán las expresiones #{}   "Hip,"*2 + "hurray!"
'una cadena entre comillas #{"simples".upcase}'
                                                          #=> Hip,Hip,hurray
#=> una cadena entre comillas #{"simples".upcase}
                                                          "Ruby, no es ... ".length
# Comillas dobles sí se evaluarán las expresiones #{}
                                                          # => 16
"una cadena entre comillas #{"dobles".upcase}"            "Ruby, no es...    ".split(/s*/)
#=> una cadena entre comillas DOBLES                      # => ["R", "u", "b", "y", ",", "n", "o",
                                                          "e", "s", ".", ".", "."]
#Varias líneas                                            "Ruby, no es python".scan(/ruby|python/i)
s=<<END                                                   # => ["Ruby", "python"]
Hola esto                                                 "Ruby, no es python".include?("python")
es un documento                                           #=>true
de texto
                                                          "Ruby, no es python".end_with?("python")
en varias lineas
                                                          #=>true
END
                                                          Ruby, no es python".gsub(/Ruby, no/i,
#Troceado de palabras                                     "Python sí ") # => Python sí es python
%w{Hola mundo} #=> ["Hola", "mundo"]




                   ✍ http://ruby-doc.org/core/classes/String.html                             ranges.rb
Símbolos (Symbol)
Representan símbolos en la tabla símbolos del intérprete. Sólo
existe una única instancia de cada símbolo durante la ejecución de
un programa. a=:hola                 a= "hola"
                   b=:hola                        b= "hola"
                   a.equal? b # => true           a.equal? b # => false
                   a==b       # => true           a==b       # => true


Se usan por eficiencia para representar cadenas constantes o
nombres. A diferencia de los strings, cada vez que se usa no se
crea una nueva instancia.
         link_to("View Article", :controller => "articles", :action => "show", :method
         =>:get)

         "Hola".method(:to_s).call

         class Persona
           attr_reader :nobre,:edad
         end



             ✍ http://ruby-doc.org/core/classes/Symbol.html
Rangos (Range)
Representan conjuntos de valores (no sólo numéricos).
Sólo almacenan los extremos
      1..10    #Números del 1 al 10
      1...10   #Números el 1 al 9 (extremo superior no incluido)
      'A'..'Z' #Letras de la A a la Z

      require 'date'
      hoy=Date.today
      hace_un_mes = hoy << 1 # Date#<<(n) Resta n meses a la fecha
      hace_un_mes...hoy      # => 2010-02-20...2010-03-20

Métodos útiles
      digits=0..9
      digits.include? 5   #   =>   true
      digits.min          #   =>   0
      digits.max          #   =>   9
      digits.minmax       #   =>   [0,9]

      digits.reject {|digit| digit % 2 == 0}    # => [1, 3, 5, 7, 9]
      digits.select {|digit| digit < 5 }        # => [0, 1, 2, 3, 4]
      digits.each   {|digit| print digit," "}   # 0 1 2 3 4 5 6 7 8 9
      digits.to_a                               #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


           ✍ http://ruby-doc.org/core/classes/Range.html
Listas (Array)
#Construcción
vector=[1,"dos",3]
                                                                #Comprobaciones
vector=Array.new
vector=[]                                                       [].empty?             # => true
                                                                [1,3].length          # => 2
#Accesso
vector=[1,"dos",3]                                              #Pilas
vector[0]="uno"                                                 pila=[]
vector # => ["uno", "dos", 3]                                   pila.push(1)
                                                                pila.push(2,3)
#Índices negativos                                              3.times{ puts pila.pop }          # imprime 3,2,1
vector[-1] # => 3

#Acceso (out of bounds)
vector[9082374] # => nil                                        #Colas
                                                                cola=[]
#Acceso (métodos especiales)                                    3.times{|i| cola.push i+1}
vector.first # => "uno"                                         3.times{|i| puts cola.shift}      # imprime 1,2,3
vector.last # => "3"
                                                                #Conjuntos
#Subconjuntos                                                   [1,2,3] & [2,2,3,4]     #=>   [2, 3]: Intersección
numeros=(0..9).to_a   #   =>   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   [1,2,3] | [2,2,3,4]     #=>   [1, 2, 3, 4]:Unión
numeros[3..6]         #   =>   [3, 4, 5, 6]
                                                                [1,2,3] - [2,2,3,4]     #=>   [1]: Diferencia
numeros[-4..-1]       #   =>   [6, 7, 8, 9]
                                                                [1,2,3].include? 3      #=>   true
numeros[-1..-4]       #   =>   [] rango no creciente
numeros[0..5] = "x"   #   =>   ["x", 6, 7, 8, 9]



                      ✍        http://ruby-doc.org/core/classes/Array.html
Diccionarios (Hash)
                                      #Paso de named parameters
                                      def http_request(url,args)
                                        default_args={
#Construcción                             :method=>:get,
animales = {                              :request_parameters=>{},
:perro => "pluto",                        :http_headers=>{:accept=>"text/html"}
:pato => "donald",                      }
:raton => "mickey"                      args=default_args.merge(args)
}                                       do_request(args[:method],url,args[:request_parameters],args[:http_headers])
                                      end
#Acceso (lee el valor) y lo
modifica                              def do_request(method,url,request_parameters,http_headers)
animales[:perro].upcase!                puts %Q{
animales # =>                             method =>#{method}
{:perro=>"PLUTO",                         url =>#{url}
 :pato=>"donald",                         request parameters =>#{request_parameters}
 :raton=>"mickey"}                        http_headers =>#{http_headers}
                                        }
#Iteración                            end
animales.each_pair do |clave,valor|
  puts "El #{clave} se llama
                                      http_request("http://www.gooogle.es")
#{valor}"
end
                                      http_request("http://www.gooogle.es",:method=>:get)
                                      http_request("http://
                                      www.gooogle.es",:method=>:get, :request_parameters=>{:q=>"libros"})




                      ✍     http://ruby-doc.org/core/classes/Hash.html
Expresiones regulares (Regexp)
#Literales
animal_domestico=/perro|gato|pajaro/i
animal_domestico=Regexp.new("/perro|gato|pajaro")

#Coincidencia                                       #Matching
"perro" === animal_domestico                        mail=/^([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/i
# => false (Case equality de String)                match=mail.match("miguelff@innova.uniovi.es")
animal_domestico === "perro"                        match[0]
#=> true (Case equality de Regexp)                  #=> miguelff@innova.uniovi.es
                                                    match[1]
                                                    #=> miguelff
                                                    match[2]
#Aparición                                          #=> innova.uniovi.es
/perro|gato|pajaro/ =~ "Mi perro se llama shorty"
#=> 3 (primera posición donde aparece)

/perro|gato|pajaro/ =~ "Tengo una iguana"
#=> nil (no hay aparición)




                  ✍http://ruby-doc.org/core/classes/Regexp.html
Control de flujo

 if / unless / case - when

       while / until
if / unless
  Toda expresión evalúa a true, excepto false y nil

if [expresion] #leer "si"
                                                         unless [expresion] #leer "a menos que"
  "acción si expresión evalua a true"
                                                           "accion si expresion evalua a false"
elsif [expresion2]
                                                         else
  "acción si expresion2 se evalua a true"
                                                           "acción si expresión se evalua a true"
else
                                                         end
  "acción si no si expresion y expresion 2 son falsas"
end


                              #Asignar sólo si nombre tiene un valor
                              def name=(name)
                                @name = name if name
                              end

                              def name=(name)
                                @name = name unless name.nil?
                              end




                ✍     http://ruby-doc.org/core/classes/Hash.html
case - when
case retorna la expresión del primer when que evalúa a
true.           score=75
                     result = case score
                         when 0...50 then "Fail"
                         when 50...70 then "Pass"
                         when 70...90 then "Pass with Merit"
                         when 90..100 then "Pass with Distinction"
                         else "Invalid Score"
                     end
                     puts result #Pass with Merit


El criterio del when puede ser cualquier instancia, ésta se comparará
con el argumento del case usando el método ===.
        ------------------------------------------------------------- Object#===
             obj === other   => true or false
        ------------------------------------------------------------------------
        Case Equality---For class +Object+, effectively the same as calling
        +#==+, but typically overridden by descendents to provide
        meaningful semantics in +case+ statements.
for / while / until
    array= ["fresa", "platano", "piña"]

    for i in (0...array.length)
      puts "En la posicion #{i}, #{array[i]}"
    end




    i=0
    while i < array.legth
      puts "En la posicion #{i}, #{array[i]}"
      i+=1
    end




    i=0
    until i==array.legth
      puts "En la posicion #{i}, #{array[i]}"
      i+=1
    end
Gestión de excepciones
                         Lanzamiento
def invert(x)
  raise ArgumentError, "#{x} no es un numero" unless x.is_a? Numeric
  1.0 / x
end


   *Ejecutar en terminal $ri Kernel#raise
                             Gestión
  require "open-uri"
  def check_connection(max_tries=2, url="http://www.ruby-lang.org")
    tries=0
    begin
      tries+=1
      puts "Comprobando conexión"
      open(url){puts "Ok!"}
    rescue Exception => e
      puts "Conexión fallida: #{e.message}"
      retry unless tries >= max_tries
    end
  end
Módulos y Mix-ins
 Los módulos son una primitiva del lenguaje que permite
       agrupar métodos, clases, constantes, etc.


• Crean   espacios de nombres y previenen colisiones

    módulos permiten articular mixins (herencia múltiple de
• Los
 comportamiento)




                                                       modules.rb
Train yourself
  Crear un programa que dado un número, calcule su
representación en forma de displays de 7 segmentos. El
programa recibirá el número a representar, y el tamaño
                       del dígito.

             > lcd.rb -s 1 6789   > lcd.rb -s 2 012345

              -    -   -   -       --         --    --       --
             |      | | | | |     |   |   |     |     | | | |
              -        -   -      |   |   |     |     | | | |
             | |    | | |    |                --    --   --  --
              -        -   -      |   |   | |         |    |    |
                                  |   |   | |         |    |    |
                                   --         --    --       --




                  http://www.rubyquiz.com/
Referencias

The Ruby Programming Language

http://mislav.uniqpath.com/poignant-guide/

http://ruby-doc.org/core/
Gracias



miguelff@innova.uniovi.es

More Related Content

What's hot

Programar java
Programar javaProgramar java
Programar javavloor
 
Programar java
Programar javaProgramar java
Programar javavloor
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodosDanae Aguilar Guzmán
 
Curso Swift
Curso SwiftCurso Swift
Curso SwiftPlatzi
 
Curso iOS
Curso iOSCurso iOS
Curso iOSPlatzi
 
Java script teoria
Java script teoriaJava script teoria
Java script teoriassxdan
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoojorg_marq
 
Lenguaje de Programacion - Java
Lenguaje de Programacion - JavaLenguaje de Programacion - Java
Lenguaje de Programacion - Javazousbabastre
 
Elementos del Hardware y Software
Elementos del Hardware y SoftwareElementos del Hardware y Software
Elementos del Hardware y Softwarecarlosadrianev
 
SCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, PooSCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, Pooflekoso
 
Ruby Latin Developer20012010
Ruby Latin Developer20012010Ruby Latin Developer20012010
Ruby Latin Developer20012010Miguel Rodriguez
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalMediaglobe Innova
 
PHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básicoPHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básicoSpacetoshare
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Javier Eguiluz
 

What's hot (20)

Programar java
Programar javaProgramar java
Programar java
 
Programar java
Programar javaProgramar java
Programar java
 
4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
Clase 5 funciones en javaScript
Clase 5 funciones en javaScriptClase 5 funciones en javaScript
Clase 5 funciones en javaScript
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 
Clase 6 objetos de javaScript
Clase 6 objetos de javaScriptClase 6 objetos de javaScript
Clase 6 objetos de javaScript
 
Curso Swift
Curso SwiftCurso Swift
Curso Swift
 
Curso iOS
Curso iOSCurso iOS
Curso iOS
 
Java script teoria
Java script teoriaJava script teoria
Java script teoria
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoo
 
Lenguaje de Programacion - Java
Lenguaje de Programacion - JavaLenguaje de Programacion - Java
Lenguaje de Programacion - Java
 
Elementos del Hardware y Software
Elementos del Hardware y SoftwareElementos del Hardware y Software
Elementos del Hardware y Software
 
SCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, PooSCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, Poo
 
Ruby Latin Developer20012010
Ruby Latin Developer20012010Ruby Latin Developer20012010
Ruby Latin Developer20012010
 
Curso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en DrupalCurso Drupal. Creacion de modulos en Drupal
Curso Drupal. Creacion de modulos en Drupal
 
Arrays
ArraysArrays
Arrays
 
PHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básicoPHP Tema 2 - Lenguaje PHP básico
PHP Tema 2 - Lenguaje PHP básico
 
Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8Twig, el nuevo motor de plantillas de Drupal 8
Twig, el nuevo motor de plantillas de Drupal 8
 
Tema2 3
Tema2 3Tema2 3
Tema2 3
 

Viewers also liked

Desarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsDesarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsErnesto Jiménez
 
CSS Preprocessors - Sass
CSS Preprocessors - SassCSS Preprocessors - Sass
CSS Preprocessors - SassLourdes Montano
 
Curso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsAlberto Perdomo
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas
 
Desarrollo Agil con Ruby Y Rails
Desarrollo Agil con Ruby Y RailsDesarrollo Agil con Ruby Y Rails
Desarrollo Agil con Ruby Y RailsFran Diéguez
 
Conviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-endConviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-endvideo2brain_mx
 
Sass: CSS con Superpoderes
Sass: CSS con SuperpoderesSass: CSS con Superpoderes
Sass: CSS con SuperpoderesEdgar Parada
 
Pre-procesadores CSS. SASS
Pre-procesadores CSS. SASSPre-procesadores CSS. SASS
Pre-procesadores CSS. SASSMarionaCruz
 
Uso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en AstronomíaUso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en AstronomíaJose Gomez Castaño
 
Curso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasCurso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasAlberto Perdomo
 
Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2estialvarez
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on RailsASPgems
 
Haml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticosHaml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticosDAVID GRILLI
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsFreelancer
 
Multiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de cssMultiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de cssLeonidas Esteban González
 

Viewers also liked (20)

Desarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsDesarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on Rails
 
CSS Preprocessors - Sass
CSS Preprocessors - SassCSS Preprocessors - Sass
CSS Preprocessors - Sass
 
Curso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubs
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
 
Desarrollo Agil con Ruby Y Rails
Desarrollo Agil con Ruby Y RailsDesarrollo Agil con Ruby Y Rails
Desarrollo Agil con Ruby Y Rails
 
Conviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-endConviértete en un desarrollador web front-end
Conviértete en un desarrollador web front-end
 
Sass: CSS con Superpoderes
Sass: CSS con SuperpoderesSass: CSS con Superpoderes
Sass: CSS con Superpoderes
 
Pre-procesadores CSS. SASS
Pre-procesadores CSS. SASSPre-procesadores CSS. SASS
Pre-procesadores CSS. SASS
 
Uso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en AstronomíaUso de las Infraestructuras de Datos Espaciales en Astronomía
Uso de las Infraestructuras de Datos Espaciales en Astronomía
 
Lenguaje de programación Ruby
Lenguaje de programación RubyLenguaje de programación Ruby
Lenguaje de programación Ruby
 
Sass y compass
Sass y compassSass y compass
Sass y compass
 
Curso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticasCurso TDD Ruby on Rails #08: Buenas prácticas
Curso TDD Ruby on Rails #08: Buenas prácticas
 
Taller ruby
Taller rubyTaller ruby
Taller ruby
 
Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2Curso de Ruby on Rails para el Master de Deusto. Día 2
Curso de Ruby on Rails para el Master de Deusto. Día 2
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Ruby Facil
Ruby FacilRuby Facil
Ruby Facil
 
Haml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticosHaml y Sass: HTML y CSS dietéticos
Haml y Sass: HTML y CSS dietéticos
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Multiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de cssMultiplica tu productividad usando un preprocesador de css
Multiplica tu productividad usando un preprocesador de css
 

Similar to Ruby intro

Introducción a Ruby on Rails
Introducción a Ruby on RailsIntroducción a Ruby on Rails
Introducción a Ruby on Railsguest638090
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friendflekoso
 
Ruby exposición
Ruby exposiciónRuby exposición
Ruby exposiciónrossel2018
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMjavier ramirez
 
Tipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje CTipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje Cefrenpedro92
 
Tipos de datos usados en c
Tipos de datos usados en cTipos de datos usados en c
Tipos de datos usados en clagq
 
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...David Zapateria Besteiro
 
Workshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyWorkshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyEdgar Suarez
 
Funciones de Strings en PHP
Funciones de Strings en PHPFunciones de Strings en PHP
Funciones de Strings en PHPAngie Mejia
 
Lenguajec intorduccionui
Lenguajec intorduccionuiLenguajec intorduccionui
Lenguajec intorduccionui3dwin3
 

Similar to Ruby intro (20)

Ruby
RubyRuby
Ruby
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Introducción a Ruby on Rails
Introducción a Ruby on RailsIntroducción a Ruby on Rails
Introducción a Ruby on Rails
 
Ruby 01
Ruby 01Ruby 01
Ruby 01
 
Ruby
Ruby Ruby
Ruby
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friend
 
Ruby exposición
Ruby exposiciónRuby exposición
Ruby exposición
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVM
 
Tema2[php]
Tema2[php]Tema2[php]
Tema2[php]
 
Python para principiantes
Python para principiantesPython para principiantes
Python para principiantes
 
Tipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje CTipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje C
 
Tipos de datos usados en c
Tipos de datos usados en cTipos de datos usados en c
Tipos de datos usados en c
 
Php
PhpPhp
Php
 
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
 
C ++
C ++C ++
C ++
 
Workshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyWorkshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a Ruby
 
Funciones de Strings en PHP
Funciones de Strings en PHPFunciones de Strings en PHP
Funciones de Strings en PHP
 
Lenguajec intorduccionui
Lenguajec intorduccionuiLenguajec intorduccionui
Lenguajec intorduccionui
 
Idiomatic Ruby
Idiomatic RubyIdiomatic Ruby
Idiomatic Ruby
 
Perl2 arrays
Perl2 arraysPerl2 arrays
Perl2 arrays
 

More from Miguel Fernández

More from Miguel Fernández (6)

Hierarchical taxonomy extraction
Hierarchical taxonomy extractionHierarchical taxonomy extraction
Hierarchical taxonomy extraction
 
Yahoo! pipes
Yahoo! pipesYahoo! pipes
Yahoo! pipes
 
Real-time web
Real-time webReal-time web
Real-time web
 
Screen scraping
Screen scrapingScreen scraping
Screen scraping
 
App engine
App engineApp engine
App engine
 
Rails intro
Rails introRails intro
Rails intro
 

Ruby intro

  • 1. DESARROLLO WEB AVANZADO Desarrollo rápido con Ruby on Rails Miguel Fernández Fernández
  • 3. Ruby es un lenguaje... Orientado a objetos Dinámico Funcional Productivo
  • 4. Ruby es Orientado a Objetos No existen tipos primitivos. Todos los literales son objetos -199.abs # 199 "ruby no está nada mal".length # 21 ["G", "A", "T", "T", "A", "C", "A"].uniq.sort.join # "ACGT" {:hielo=>"frío", :fuego=>"caliente"}.values # [“frío”,”caliente”] El estado y comportamiento de los objetos se define a través de clases class Punto attr_accessor :x,:y def initialize(x,y) @x=x origen=Punto.new(0,0) @y=y origen.x+=1 #igual que origen.x=origen.x+1 end puts origen #=> Punto (1,0) def to_s "Punto (#{@x},#{@y})" end end ruby_oo.rb
  • 5. Ruby es dinámico No hay declaraciones explícitas de tipos lista=[1,2,3,"Hola"] #ruby List<? extends Object> lista= Arrays.asList(1,2,"Hola"); //java El tipo de los objetos viene determinado por su conjunto de métodos y no por la clase a la que pertenezca.* *Duck typing: a way of thinking about ruby programming - duck_typing.rb http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502
  • 6. Ruby es funcional En ruby todas las funciones pueden recibir un bloque, que es una función anónima. [1,2,3].map{ |x| x**2 } #[1, 4, 9] 10.downto(1){ |x| puts x } # imprime los números del 10 al 1 Los bloques permiten parametrizar el comportamiento de la función que la recibe (patrón Strategy) %w(ruby es ruby, no c++).sort do |una_palabra,otra_palabra| una_palabra.size - otra_palabra.size end #["no", "es", "c++", "ruby", "ruby,"] blocks.rb anonymous.java
  • 7. Ruby es funcional block_given? permite conocer si se ha pasado un bloque a una función y yield permite invocarlo. class Array def filtra [1,2,3,4].filtra do filtrados=[] |elemento| elemento % 2 == 0 if block_given? end each do |elemento| #=> [2,4] filtrados << elemento if yield elemento end colores=%w{rojo amarillo azul verde} filtrados %w{el cielo es azul}.filtra do else |palabra| colores.member? palabra self end end #=>["azul"] end end blocks.rb
  • 8. Ruby es un lenguaje productivo El carácter dinámico y funcional del lenguaje, unido a una API completa, hacen que el código sea más compacto y legible. Ruby es reflectivo. El código puede ser observado y modificado en tiempo de ejecución ➔ El propio programa puede crear código por nosotros (metaprogramación) reflection.rb
  • 9. Core API (at a glance) Números Cadenas y Símbolos Rangos, Listas y Diccionarios Expresiones regulares http://www.ruby-doc.org/core/
  • 10. Números (Numeric & sons.) Tipos -123456 #Fixnum (negativo) 123_456 #Fixnum (se ignora '_') .4 #Float 2.3 #Float Iteraciones 3.times { print "X "} #=> X X X 6.upto(9){ |i| print i, " " if i % 2 == 0} #=> 6 8 99.downto(95) { |i| print i," "} #=> 99 98 97 96 95 50.step(80,5) { |i| print i," "} #=> 50 55 60 65 70 75 80 Conversiones 3.to_f #=> 3.0 -3.456_789.to_i #=> -3 9.81.floor #=> 9 -0.21.floor #=> -1 9.3.ceil #=> 10 9.5.round #=> 10 9.3.round #=> 9
  • 11. Cadenas (String) A diferencia de la mayoría de los lenguajes de alto nivel, son objetos mutables # Comillas simples: no se evaluarán las expresiones #{} "Hip,"*2 + "hurray!" 'una cadena entre comillas #{"simples".upcase}' #=> Hip,Hip,hurray #=> una cadena entre comillas #{"simples".upcase} "Ruby, no es ... ".length # Comillas dobles sí se evaluarán las expresiones #{} # => 16 "una cadena entre comillas #{"dobles".upcase}" "Ruby, no es... ".split(/s*/) #=> una cadena entre comillas DOBLES # => ["R", "u", "b", "y", ",", "n", "o", "e", "s", ".", ".", "."] #Varias líneas "Ruby, no es python".scan(/ruby|python/i) s=<<END # => ["Ruby", "python"] Hola esto "Ruby, no es python".include?("python") es un documento #=>true de texto "Ruby, no es python".end_with?("python") en varias lineas #=>true END Ruby, no es python".gsub(/Ruby, no/i, #Troceado de palabras "Python sí ") # => Python sí es python %w{Hola mundo} #=> ["Hola", "mundo"] ✍ http://ruby-doc.org/core/classes/String.html ranges.rb
  • 12. Símbolos (Symbol) Representan símbolos en la tabla símbolos del intérprete. Sólo existe una única instancia de cada símbolo durante la ejecución de un programa. a=:hola a= "hola" b=:hola b= "hola" a.equal? b # => true a.equal? b # => false a==b # => true a==b # => true Se usan por eficiencia para representar cadenas constantes o nombres. A diferencia de los strings, cada vez que se usa no se crea una nueva instancia. link_to("View Article", :controller => "articles", :action => "show", :method =>:get) "Hola".method(:to_s).call class Persona attr_reader :nobre,:edad end ✍ http://ruby-doc.org/core/classes/Symbol.html
  • 13. Rangos (Range) Representan conjuntos de valores (no sólo numéricos). Sólo almacenan los extremos 1..10 #Números del 1 al 10 1...10 #Números el 1 al 9 (extremo superior no incluido) 'A'..'Z' #Letras de la A a la Z require 'date' hoy=Date.today hace_un_mes = hoy << 1 # Date#<<(n) Resta n meses a la fecha hace_un_mes...hoy # => 2010-02-20...2010-03-20 Métodos útiles digits=0..9 digits.include? 5 # => true digits.min # => 0 digits.max # => 9 digits.minmax # => [0,9] digits.reject {|digit| digit % 2 == 0} # => [1, 3, 5, 7, 9] digits.select {|digit| digit < 5 } # => [0, 1, 2, 3, 4] digits.each {|digit| print digit," "} # 0 1 2 3 4 5 6 7 8 9 digits.to_a #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ✍ http://ruby-doc.org/core/classes/Range.html
  • 14. Listas (Array) #Construcción vector=[1,"dos",3] #Comprobaciones vector=Array.new vector=[] [].empty? # => true [1,3].length # => 2 #Accesso vector=[1,"dos",3] #Pilas vector[0]="uno" pila=[] vector # => ["uno", "dos", 3] pila.push(1) pila.push(2,3) #Índices negativos 3.times{ puts pila.pop } # imprime 3,2,1 vector[-1] # => 3 #Acceso (out of bounds) vector[9082374] # => nil #Colas cola=[] #Acceso (métodos especiales) 3.times{|i| cola.push i+1} vector.first # => "uno" 3.times{|i| puts cola.shift} # imprime 1,2,3 vector.last # => "3" #Conjuntos #Subconjuntos [1,2,3] & [2,2,3,4] #=> [2, 3]: Intersección numeros=(0..9).to_a # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1,2,3] | [2,2,3,4] #=> [1, 2, 3, 4]:Unión numeros[3..6] # => [3, 4, 5, 6] [1,2,3] - [2,2,3,4] #=> [1]: Diferencia numeros[-4..-1] # => [6, 7, 8, 9] [1,2,3].include? 3 #=> true numeros[-1..-4] # => [] rango no creciente numeros[0..5] = "x" # => ["x", 6, 7, 8, 9] ✍ http://ruby-doc.org/core/classes/Array.html
  • 15. Diccionarios (Hash) #Paso de named parameters def http_request(url,args) default_args={ #Construcción :method=>:get, animales = { :request_parameters=>{}, :perro => "pluto", :http_headers=>{:accept=>"text/html"} :pato => "donald", } :raton => "mickey" args=default_args.merge(args) } do_request(args[:method],url,args[:request_parameters],args[:http_headers]) end #Acceso (lee el valor) y lo modifica def do_request(method,url,request_parameters,http_headers) animales[:perro].upcase! puts %Q{ animales # => method =>#{method} {:perro=>"PLUTO", url =>#{url} :pato=>"donald", request parameters =>#{request_parameters} :raton=>"mickey"} http_headers =>#{http_headers} } #Iteración end animales.each_pair do |clave,valor| puts "El #{clave} se llama http_request("http://www.gooogle.es") #{valor}" end http_request("http://www.gooogle.es",:method=>:get) http_request("http:// www.gooogle.es",:method=>:get, :request_parameters=>{:q=>"libros"}) ✍ http://ruby-doc.org/core/classes/Hash.html
  • 16. Expresiones regulares (Regexp) #Literales animal_domestico=/perro|gato|pajaro/i animal_domestico=Regexp.new("/perro|gato|pajaro") #Coincidencia #Matching "perro" === animal_domestico mail=/^([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/i # => false (Case equality de String) match=mail.match("miguelff@innova.uniovi.es") animal_domestico === "perro" match[0] #=> true (Case equality de Regexp) #=> miguelff@innova.uniovi.es match[1] #=> miguelff match[2] #Aparición #=> innova.uniovi.es /perro|gato|pajaro/ =~ "Mi perro se llama shorty" #=> 3 (primera posición donde aparece) /perro|gato|pajaro/ =~ "Tengo una iguana" #=> nil (no hay aparición) ✍http://ruby-doc.org/core/classes/Regexp.html
  • 17. Control de flujo if / unless / case - when while / until
  • 18. if / unless Toda expresión evalúa a true, excepto false y nil if [expresion] #leer "si" unless [expresion] #leer "a menos que" "acción si expresión evalua a true" "accion si expresion evalua a false" elsif [expresion2] else "acción si expresion2 se evalua a true" "acción si expresión se evalua a true" else end "acción si no si expresion y expresion 2 son falsas" end #Asignar sólo si nombre tiene un valor def name=(name) @name = name if name end def name=(name) @name = name unless name.nil? end ✍ http://ruby-doc.org/core/classes/Hash.html
  • 19. case - when case retorna la expresión del primer when que evalúa a true. score=75 result = case score when 0...50 then "Fail" when 50...70 then "Pass" when 70...90 then "Pass with Merit" when 90..100 then "Pass with Distinction" else "Invalid Score" end puts result #Pass with Merit El criterio del when puede ser cualquier instancia, ésta se comparará con el argumento del case usando el método ===. ------------------------------------------------------------- Object#=== obj === other => true or false ------------------------------------------------------------------------ Case Equality---For class +Object+, effectively the same as calling +#==+, but typically overridden by descendents to provide meaningful semantics in +case+ statements.
  • 20. for / while / until array= ["fresa", "platano", "piña"] for i in (0...array.length) puts "En la posicion #{i}, #{array[i]}" end i=0 while i < array.legth puts "En la posicion #{i}, #{array[i]}" i+=1 end i=0 until i==array.legth puts "En la posicion #{i}, #{array[i]}" i+=1 end
  • 21. Gestión de excepciones Lanzamiento def invert(x) raise ArgumentError, "#{x} no es un numero" unless x.is_a? Numeric 1.0 / x end *Ejecutar en terminal $ri Kernel#raise Gestión require "open-uri" def check_connection(max_tries=2, url="http://www.ruby-lang.org") tries=0 begin tries+=1 puts "Comprobando conexión" open(url){puts "Ok!"} rescue Exception => e puts "Conexión fallida: #{e.message}" retry unless tries >= max_tries end end
  • 22. Módulos y Mix-ins Los módulos son una primitiva del lenguaje que permite agrupar métodos, clases, constantes, etc. • Crean espacios de nombres y previenen colisiones módulos permiten articular mixins (herencia múltiple de • Los comportamiento) modules.rb
  • 23. Train yourself Crear un programa que dado un número, calcule su representación en forma de displays de 7 segmentos. El programa recibirá el número a representar, y el tamaño del dígito. > lcd.rb -s 1 6789 > lcd.rb -s 2 012345 - - - - -- -- -- -- | | | | | | | | | | | | | | - - - | | | | | | | | | | | | | | -- -- -- -- - - - | | | | | | | | | | | | | | -- -- -- -- http://www.rubyquiz.com/
  • 24. Referencias The Ruby Programming Language http://mislav.uniqpath.com/poignant-guide/ http://ruby-doc.org/core/

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. Como potencialmente un objeto puede tener cualquier conjunto de m&amp;#xE9;todos podemos invocar cualquier \nm&amp;#xE9;todo sobre cualquier objeto. No hay comprobaciones en tiempo de compilaci&amp;#xF3;n y tampoco en tiempo de carga (cuando se parsea un fichero fuente)\n\nHacer DEMO.\n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. * Object#equal? y Object#== Se comportan al rev&amp;#xE9;s que en Java\n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. Comentar que raise es un m&amp;#xE9;todo privado del mixin Kernel, que es mezclado por Object, y por tanto est&amp;#xE1; disponible para todos los objetos.\n
  22. \n
  23. \n
  24. \n
  25. \n