Ruby intro
Upcoming SlideShare
Loading in...5
×
 

Ruby intro

on

  • 1,038 views

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)

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)

Statistics

Views

Total Views
1,038
Views on SlideShare
1,035
Embed Views
3

Actions

Likes
0
Downloads
21
Comments
0

1 Embed 3

http://www.linkedin.com 3

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • Como potencialmente un objeto puede tener cualquier conjunto de métodos podemos invocar cualquier \nmétodo sobre cualquier objeto. No hay comprobaciones en tiempo de compilació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és que en Java\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Comentar que raise es un método privado del mixin Kernel, que es mezclado por Object, y por tanto está disponible para todos los objetos.\n
  • \n
  • \n
  • \n
  • \n

Ruby intro Ruby intro Presentation Transcript

  • 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 # 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
  • 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 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
  • 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
  • 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
  • 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 #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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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" 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 - 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.
  • 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 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
  • 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 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/
  • ReferenciasThe Ruby Programming Languagehttp://mislav.uniqpath.com/poignant-guide/http://ruby-doc.org/core/
  • Graciasmiguelff@innova.uniovi.es