Your SlideShare is downloading. ×
0
DESARROLLO WEB  AVANZADODesarrollo rápido con Ruby on Rails                               Miguel Fernández Fernández
El lenguaje Rubyhttp://www.ruby-doc.org/docs/ProgrammingRuby/
Ruby es un lenguaje...           Orientado a objetos                Dinámico                Funcional             Productivo
Ruby es Orientado a ObjetosNo existen tipos primitivos. Todos los literales son objetos -199.abs                          ...
Ruby es dinámico   No hay declaraciones explícitas de tipos      lista=[1,2,3,"Hola"] #ruby      List<? extends Object> li...
Ruby es funcionalEn ruby todas las funciones pueden recibir un bloque, que esuna función anónima.   [1,2,3].map{ |x| x**2 ...
Ruby es funcionalblock_given? permite conocer si se ha pasado un bloquea una función y yield permite invocarlo. class Arra...
Ruby es un lenguaje productivoEl carácter dinámico y funcional del lenguaje, unido a una APIcompleta, hacen que el código ...
Core API (at a glance)            Números       Cadenas y Símbolos   Rangos, Listas y Diccionarios      Expresiones regula...
Números (Numeric & sons.)Tipos         -123456   #Fixnum (negativo)         123_456   #Fixnum (se ignora _)         .4    ...
Cadenas (String)A diferencia de la mayoría de los lenguajes de alto nivel, sonobjetos mutables# Comillas simples: no se ev...
Símbolos (Symbol)Representan símbolos en la tabla símbolos del intérprete. Sóloexiste una única instancia de cada símbolo ...
Rangos (Range)Representan conjuntos de valores (no sólo numéricos).Sólo almacenan los extremos      1..10    #Números del ...
Listas (Array)#Construcciónvector=[1,"dos",3]                                                                #Comprobacion...
Diccionarios (Hash)                                      #Paso de named parameters                                      de...
Expresiones regulares (Regexp)#Literalesanimal_domestico=/perro|gato|pajaro/ianimal_domestico=Regexp.new("/perro|gato|paja...
Control de flujo if / unless / case - when       while / until
if / unless  Toda expresión evalúa a true, excepto false y nilif [expresion] #leer "si"                                   ...
case - whencase retorna la expresión del primer when que evalúa atrue.           score=75                     result = cas...
for / while / until    array= ["fresa", "platano", "piña"]    for i in (0...array.length)      puts "En la posicion #{...
Gestión de excepciones                         Lanzamientodef invert(x)  raise ArgumentError, "#{x} no es un numero" unles...
Módulos y Mix-ins Los módulos son una primitiva del lenguaje que permite       agrupar métodos, clases, constantes, etc.• ...
Train yourself  Crear un programa que dado un número, calcule surepresentación en forma de displays de 7 segmentos. Elprog...
ReferenciasThe Ruby Programming Languagehttp://mislav.uniqpath.com/poignant-guide/http://ruby-doc.org/core/
Graciasmiguelff@innova.uniovi.es
Upcoming SlideShare
Loading in...5
×

Ruby intro

884

Published on

Diapositivas de la introducción al lenguaje ruby en el curso de extensión universitaria "Desarrollo Web Avanzado" del programa de Extensión Universitaria de la Universidad de Oviedo (2010)

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
884
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • 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
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • * Object#equal? y Object#== Se comportan al rev&amp;#xE9;s que en Java\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 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
  • \n
  • \n
  • \n
  • \n
  • Transcript of "Ruby intro"

    1. 1. DESARROLLO WEB AVANZADODesarrollo rápido con Ruby on Rails Miguel Fernández Fernández
    2. 2. El lenguaje Rubyhttp://www.ruby-doc.org/docs/ProgrammingRuby/
    3. 3. Ruby es un lenguaje... Orientado a objetos Dinámico Funcional Productivo
    4. 4. Ruby es Orientado a ObjetosNo 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ésde 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. 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. 6. Ruby es funcionalEn ruby todas las funciones pueden recibir un bloque, que esuna 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 1Los bloques permiten parametrizar el comportamiento de lafunció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. 7. Ruby es funcionalblock_given? permite conocer si se ha pasado un bloquea 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. 8. Ruby es un lenguaje productivoEl carácter dinámico y funcional del lenguaje, unido a una APIcompleta, hacen que el código sea más compacto y legible.Ruby es reflectivo. El código puede ser observado y modificadoen tiempo de ejecución ➔ El propio programa puede crearcódigo por nosotros (metaprogramación) reflection.rb
    9. 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. 10. Números (Numeric & sons.)Tipos -123456 #Fixnum (negativo) 123_456 #Fixnum (se ignora _) .4 #Float 2.3 #FloatIteraciones 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 80Conversiones 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. 11. Cadenas (String)A diferencia de la mayoría de los lenguajes de alto nivel, sonobjetos 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 #=>truede texto "Ruby, no es python".end_with?("python")en varias lineas #=>trueEND 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. 12. Símbolos (Symbol)Representan símbolos en la tabla símbolos del intérprete. Sóloexiste una única instancia de cada símbolo durante la ejecución deun programa. a=:hola a= "hola" b=:hola b= "hola" a.equal? b # => true a.equal? b # => false a==b # => true a==b # => trueSe usan por eficiencia para representar cadenas constantes onombres. A diferencia de los strings, cada vez que se usa no secrea 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. 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-20Mé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. 14. Listas (Array)#Construcciónvector=[1,"dos",3] #Comprobacionesvector=Array.newvector=[] [].empty? # => true [1,3].length # => 2#Accessovector=[1,"dos",3] #Pilasvector[0]="uno" pila=[]vector # => ["uno", "dos", 3] pila.push(1) pila.push(2,3)#Índices negativos 3.times{ puts pila.pop } # imprime 3,2,1vector[-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,3vector.last # => "3" #Conjuntos#Subconjuntos [1,2,3] & [2,2,3,4] #=> [2, 3]: Intersecciónnumeros=(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ónnumeros[3..6] # => [3, 4, 5, 6] [1,2,3] - [2,2,3,4] #=> [1]: Diferencianumeros[-4..-1] # => [6, 7, 8, 9] [1,2,3].include? 3 #=> truenumeros[-1..-4] # => [] rango no crecientenumeros[0..5] = "x" # => ["x", 6, 7, 8, 9] ✍ http://ruby-doc.org/core/classes/Array.html
    15. 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 lomodifica 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 endanimales.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. 16. Expresiones regulares (Regexp)#Literalesanimal_domestico=/perro|gato|pajaro/ianimal_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. 17. Control de flujo if / unless / case - when while / until
    18. 18. if / unless Toda expresión evalúa a true, excepto false y nilif [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. 19. case - whencase retorna la expresión del primer when que evalúa atrue. 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 MeritEl 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. 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. 21. Gestión de excepciones Lanzamientodef invert(x) raise ArgumentError, "#{x} no es un numero" unless x.is_a? Numeric 1.0 / xend *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. 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. 23. Train yourself Crear un programa que dado un número, calcule surepresentación en forma de displays de 7 segmentos. Elprograma 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. 24. ReferenciasThe Ruby Programming Languagehttp://mislav.uniqpath.com/poignant-guide/http://ruby-doc.org/core/
    25. 25. Graciasmiguelff@innova.uniovi.es
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×