SlideShare une entreprise Scribd logo
1  sur  26
DESARROLLO WEB
AVANZADO
Desarrollo rápido con Ruby on Rails
Miguel Fernández Fernández
miguel@ThirdWay.es
El lenguaje Ruby
http://www.ruby-doc.org/docs/ProgrammingRuby/
Ruby es un lenguaje...
Productivo
Dinámico
Orientado a objetos
Funcional
Ruby es Orientado a 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”]
No existen tipos primitivos.Todos los literales son objetos
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
@y=y
end
def to_s
"Punto (#{@x},#{@y})"
end
end
origen=Punto.new(0,0)
origen.x+=1 #igual que origen.x=origen.x+1
puts origen #=> Punto (1,0)
ruby_oo.rb
Ruby es dinámico
No hay declaraciones explícitas de tipos
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 -
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502
lista=[1,2,3,"Hola"] #ruby
List<? extends Object> lista= Arrays.asList(1,2,"Hola"); //java
duck_typing.rb
Ruby es funcional
En ruby todas las funciones pueden recibir un bloque, que es
una función anónima.
anonymous.java
[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
Ruby es funcional
block_given? permite conocer si se ha pasado un bloque
a una función y yield permite invocarlo.
blocks.rb
class Array
def filtra
filtrados=[]
if block_given?
each do |elemento|
filtrados << elemento if yield elemento
end
filtrados
else
self
end
end
end
[1,2,3,4].filtra do
|elemento| elemento % 2 == 0
end
#=> [2,4]
colores=%w{rojo amarillo azul verde}
%w{el cielo es azul}.filtra do
|palabra| colores.member? palabra
end
#=>["azul"]
Ruby es un lenguaje productivo
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
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.
Core API (at a glance)
Cadenas y Símbolos
Números
Expresiones regulares
http://www.ruby-doc.org/core/
Rangos, Listas y Diccionarios
Números (Numeric & sons.)
-123456 #Fixnum (negativo)
123_456 #Fixnum (se ignora '_')
.4 #Float
2.3 #Float
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
Tipos
Iteraciones
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)
ranges.rb
http://ruby-doc.org/core/classes/String.html
A diferencia de la mayoría de los lenguajes de alto nivel, son
objetos mutables
# Comillas simples: no se evaluarán las expresiones #{}
'una cadena entre comillas #{"simples".upcase}'
#=> una cadena entre comillas #{"simples".upcase}
# Comillas dobles sí se evaluarán las expresiones #{}
"una cadena entre comillas #{"dobles".upcase}"
#=> una cadena entre comillas DOBLES
#Varias líneas
s=<<END
Hola esto
es un documento
de texto
en varias lineas
END
#Troceado de palabras
%w{Hola mundo} #=> ["Hola", "mundo"]
"Hip,"*2 + "hurray!"
#=> Hip,Hip,hurray
"Ruby, no es ... ".length
# => 16
"Ruby, no es... ".split(/s*/)
# => ["R", "u", "b", "y", ",", "n", "o",
"e", "s", ".", ".", "."]
"Ruby, no es python".scan(/ruby|python/i)
# => ["Ruby", "python"]
"Ruby, no es python".include?("python")
#=>true
"Ruby, no es python".end_with?("python")
#=>true
Ruby, no es python".gsub(/Ruby, no/i,
"Python sí ") # => Python sí es python
✍
Símbolos (Symbol)
http://ruby-doc.org/core/classes/Symbol.html
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
b=:hola
a.equal? b # => true
a==b # => true
a= "hola"
b= "hola"
a.equal? b # => false
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
✍
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)
http://ruby-doc.org/core/classes/Array.html
✍
#Construcción
vector=[1,"dos",3]
vector=Array.new
vector=[]
#Accesso
vector=[1,"dos",3]
vector[0]="uno"
vector # => ["uno", "dos", 3]
#Índices negativos
vector[-1] # => 3
#Acceso (out of bounds)
vector[9082374] # => nil
#Acceso (métodos especiales)
vector.first # => "uno"
vector.last # => "3"
#Subconjuntos
numeros=(0..9).to_a # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numeros[3..6] # => [3, 4, 5, 6]
numeros[-4..-1] # => [6, 7, 8, 9]
numeros[-1..-4] # => [] rango no creciente
numeros[0..5] = "x" # => ["x", 6, 7, 8, 9]
#Comprobaciones
[].empty? # => true
[1,3].length # => 2
#Pilas
pila=[]
pila.push(1)
pila.push(2,3)
3.times{ puts pila.pop } # imprime 3,2,1
#Colas
cola=[]
3.times{|i| cola.push i+1}
3.times{|i| puts cola.shift} # imprime 1,2,3
#Conjuntos
[1,2,3] & [2,2,3,4] #=> [2, 3]: Intersección
[1,2,3] | [2,2,3,4] #=> [1, 2, 3, 4]:Unión
[1,2,3] - [2,2,3,4] #=> [1]: Diferencia
[1,2,3].include? 3 #=> true
Diccionarios (Hash)
http://ruby-doc.org/core/classes/Hash.html
✍
#Construcción
animales = {
:perro => "pluto",
:pato => "donald",
:raton => "mickey"
}
#Acceso (lee el valor) y lo
modifica
animales[:perro].upcase!
animales # =>
{:perro=>"PLUTO",
:pato=>"donald",
:raton=>"mickey"}
#Iteración
animales.each_pair do |clave,valor|
puts "El #{clave} se llama #
{valor}"
end
#Paso de named parameters
def http_request(url,args)
default_args={
:method=>:get,
:request_parameters=>{},
:http_headers=>{:accept=>"text/html"}
}
args=default_args.merge(args)
do_request(args[:method],url,args[:request_parameters],args[:http_headers])
end
def do_request(method,url,request_parameters,http_headers)
puts %Q{
method =>#{method}
url =>#{url}
request parameters =>#{request_parameters}
http_headers =>#{http_headers}
}
end
http_request("http://www.gooogle.es")
http_request("http://www.gooogle.es",:method=>:get)
http_request("http://www.gooogle.es",:method=>:get, :request_parameters=>
{:q=>"libros"})
Expresiones regulares (Regexp)
http://ruby-doc.org/core/classes/Regexp.html
✍
#Literales
animal_domestico=/perro|gato|pajaro/i
animal_domestico=Regexp.new("/perro|gato|pajaro")
#Coincidencia
"perro" === animal_domestico
# => false (Case equality de String)
animal_domestico === "perro"
#=> true (Case equality de Regexp)
#Aparición
/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)
#Matching
mail=/^([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/i
match=mail.match("miguelff@innova.uniovi.es")
match[0]
#=> miguelff@innova.uniovi.es
match[1]
#=> miguelff
match[2]
#=> innova.uniovi.es
Control de flujo
while / until
if / unless / case - when
if / unless
http://ruby-doc.org/core/classes/Hash.html
✍
Toda expresión evalúa a true, excepto false y nil
#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
if [expresion] #leer "si"
"acción si expresión evalua a true"
elsif [expresion2]
"acción si expresion2 se evalua a true"
else
"acción si no si expresion y expresion 2 son falsas"
end
unless [expresion] #leer "a menos que"
"accion si expresion evalua a false"
else
"acción si expresión se evalua a true"
end
case - when
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
case retorna la expresión del primer when que evalúa a
true.
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
Gestión
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
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
• Crean espacios de nombres y previenen colisiones
• Los módulos permiten articular mixins (herencia múltiple de
comportamiento)
Los módulos son una primitiva del lenguaje que permite
agrupar métodos, clases, constantes, etc.
modules.rb
Train yourself
http://www.rubyquiz.com/
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 2 012345
-- -- -- --
| | | | | | | |
| | | | | | | |
-- -- -- --
| | | | | | |
| | | | | | |
-- -- -- --
> lcd.rb -s 1 6789
- - - -
| | | | | |
- - -
| | | | | |
- - -
Referencias
The Ruby Programming Language
http://mislav.uniqpath.com/poignant-guide/
http://ruby-doc.org/core/
Gracias
DESARROLLO WEB
AVANZADO
Desarrollo rápido con Ruby on Rails
Miguel Fernández Fernández
miguel@ThirdWay.es

Contenu connexe

Tendances

Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swiftbetabeers
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM DoctrineDecharlas
 
Curso Swift
Curso SwiftCurso Swift
Curso SwiftPlatzi
 
Unidad vi esp parte 2 procesimientos en plsql y transact sql
Unidad vi esp parte 2 procesimientos en plsql y transact sqlUnidad vi esp parte 2 procesimientos en plsql y transact sql
Unidad vi esp parte 2 procesimientos en plsql y transact sqlTitiushko Jazz
 
Charla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptCharla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptRicardo Pallás Román
 
Ejercicios resueltos de programacion
Ejercicios resueltos de programacionEjercicios resueltos de programacion
Ejercicios resueltos de programacionJaime amambal
 
Programa en java para calcular promedios
Programa en java para calcular promediosPrograma en java para calcular promedios
Programa en java para calcular promediosCarmen Nereira
 
Programacion en python_1
Programacion en python_1Programacion en python_1
Programacion en python_1wozgeass
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcionalJuan Rodríguez
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenashorusblom
 
eduardo hernandez investigacion 1
eduardo hernandez investigacion 1eduardo hernandez investigacion 1
eduardo hernandez investigacion 1guest79d55c9
 

Tendances (17)

Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swift
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
 
Curso Swift
Curso SwiftCurso Swift
Curso Swift
 
Tipos basicos
Tipos basicosTipos basicos
Tipos basicos
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Unidad vi esp parte 2 procesimientos en plsql y transact sql
Unidad vi esp parte 2 procesimientos en plsql y transact sqlUnidad vi esp parte 2 procesimientos en plsql y transact sql
Unidad vi esp parte 2 procesimientos en plsql y transact sql
 
Charla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptCharla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScript
 
Elemento 4
Elemento 4Elemento 4
Elemento 4
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Ejercicios resueltos de programacion
Ejercicios resueltos de programacionEjercicios resueltos de programacion
Ejercicios resueltos de programacion
 
Programa en java para calcular promedios
Programa en java para calcular promediosPrograma en java para calcular promedios
Programa en java para calcular promedios
 
Programacion en python_1
Programacion en python_1Programacion en python_1
Programacion en python_1
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenas
 
El codigo ascii
El codigo asciiEl codigo ascii
El codigo ascii
 
eduardo hernandez investigacion 1
eduardo hernandez investigacion 1eduardo hernandez investigacion 1
eduardo hernandez investigacion 1
 
Arreglos. lidia
Arreglos. lidiaArreglos. lidia
Arreglos. lidia
 

En vedette

CV - Harvey F Davis III
CV - Harvey F Davis IIICV - Harvey F Davis III
CV - Harvey F Davis IIIHarvey Davis
 
Integral de Raíz Cúbica de Tan(x)
Integral de Raíz Cúbica de Tan(x)Integral de Raíz Cúbica de Tan(x)
Integral de Raíz Cúbica de Tan(x)Erick Calderin
 
Collezione Barazza 2015 italiano
Collezione Barazza 2015 italianoCollezione Barazza 2015 italiano
Collezione Barazza 2015 italianoMeka Home Design
 
C:\Fakepath\Algas y Biocombustible
C:\Fakepath\Algas y BiocombustibleC:\Fakepath\Algas y Biocombustible
C:\Fakepath\Algas y BiocombustibleVidalBanez
 
Certificat ISO 9001:2008 Toa Electronics
Certificat ISO 9001:2008 Toa ElectronicsCertificat ISO 9001:2008 Toa Electronics
Certificat ISO 9001:2008 Toa ElectronicsRomAudioVideo
 
Curriculo mari[1]
Curriculo mari[1]Curriculo mari[1]
Curriculo mari[1]Elda Parra
 
Viewfinder July 2015
Viewfinder July 2015Viewfinder July 2015
Viewfinder July 2015belcar
 
Jellybooks leipzig v_12_abbr (june'16)
Jellybooks leipzig v_12_abbr (june'16)Jellybooks leipzig v_12_abbr (june'16)
Jellybooks leipzig v_12_abbr (june'16)Andrew Rhomberg
 
Cavazza Iab Chile 2008
Cavazza Iab Chile 2008Cavazza Iab Chile 2008
Cavazza Iab Chile 2008Andres Lagos
 
Practico n° 5 power point - ofimatica
Practico n° 5   power point - ofimaticaPractico n° 5   power point - ofimatica
Practico n° 5 power point - ofimaticawanorberto
 
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolow
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolowAntoine cierplikowski-krol-fryzjerow-fryzjer-krolow
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolowKsięgarnia Grzbiet
 
Your Partner For Success
Your Partner For SuccessYour Partner For Success
Your Partner For SuccessClubTec
 
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...NorthwireCable
 
El verdadero significado de la ingeniería de tránsito
El verdadero significado de la ingeniería de tránsitoEl verdadero significado de la ingeniería de tránsito
El verdadero significado de la ingeniería de tránsitoSino Puleo
 
Finanzas para jóvenes 2016
Finanzas para jóvenes 2016Finanzas para jóvenes 2016
Finanzas para jóvenes 2016juansalas
 
El reto de la innovación en el sector industrial. Antonio Collado González
El reto de la innovación en el sector industrial. Antonio Collado GonzálezEl reto de la innovación en el sector industrial. Antonio Collado González
El reto de la innovación en el sector industrial. Antonio Collado GonzálezFundación FYDE-CajaCanarias
 

En vedette (20)

CV - Harvey F Davis III
CV - Harvey F Davis IIICV - Harvey F Davis III
CV - Harvey F Davis III
 
Integral de Raíz Cúbica de Tan(x)
Integral de Raíz Cúbica de Tan(x)Integral de Raíz Cúbica de Tan(x)
Integral de Raíz Cúbica de Tan(x)
 
Collezione Barazza 2015 italiano
Collezione Barazza 2015 italianoCollezione Barazza 2015 italiano
Collezione Barazza 2015 italiano
 
C:\Fakepath\Algas y Biocombustible
C:\Fakepath\Algas y BiocombustibleC:\Fakepath\Algas y Biocombustible
C:\Fakepath\Algas y Biocombustible
 
Certificat ISO 9001:2008 Toa Electronics
Certificat ISO 9001:2008 Toa ElectronicsCertificat ISO 9001:2008 Toa Electronics
Certificat ISO 9001:2008 Toa Electronics
 
Curriculo mari[1]
Curriculo mari[1]Curriculo mari[1]
Curriculo mari[1]
 
Viewfinder July 2015
Viewfinder July 2015Viewfinder July 2015
Viewfinder July 2015
 
Jellybooks leipzig v_12_abbr (june'16)
Jellybooks leipzig v_12_abbr (june'16)Jellybooks leipzig v_12_abbr (june'16)
Jellybooks leipzig v_12_abbr (june'16)
 
Harisha's Digital Story
Harisha's Digital StoryHarisha's Digital Story
Harisha's Digital Story
 
Cavazza Iab Chile 2008
Cavazza Iab Chile 2008Cavazza Iab Chile 2008
Cavazza Iab Chile 2008
 
BT Group BDI
BT Group BDIBT Group BDI
BT Group BDI
 
Practico n° 5 power point - ofimatica
Practico n° 5   power point - ofimaticaPractico n° 5   power point - ofimatica
Practico n° 5 power point - ofimatica
 
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolow
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolowAntoine cierplikowski-krol-fryzjerow-fryzjer-krolow
Antoine cierplikowski-krol-fryzjerow-fryzjer-krolow
 
Your Partner For Success
Your Partner For SuccessYour Partner For Success
Your Partner For Success
 
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...
Deslocalización contra relocalización - Documento del sitio de NWI: Costo tot...
 
El verdadero significado de la ingeniería de tránsito
El verdadero significado de la ingeniería de tránsitoEl verdadero significado de la ingeniería de tránsito
El verdadero significado de la ingeniería de tránsito
 
Finanzas para jóvenes 2016
Finanzas para jóvenes 2016Finanzas para jóvenes 2016
Finanzas para jóvenes 2016
 
Center for Regional Economic Issues (REI) Summary V.2.4
Center for Regional Economic Issues (REI) Summary V.2.4Center for Regional Economic Issues (REI) Summary V.2.4
Center for Regional Economic Issues (REI) Summary V.2.4
 
El reto de la innovación en el sector industrial. Antonio Collado González
El reto de la innovación en el sector industrial. Antonio Collado GonzálezEl reto de la innovación en el sector industrial. Antonio Collado González
El reto de la innovación en el sector industrial. Antonio Collado González
 
Las vanguardias
Las vanguardiasLas vanguardias
Las vanguardias
 

Similaire à Ruby

Introducción a Ruby on Rails
Introducción a Ruby on RailsIntroducción a Ruby on Rails
Introducción a Ruby on Railsguest638090
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)Oliver Centeno
 
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Agile Spain
 
Elementos del Hardware y Software
Elementos del Hardware y SoftwareElementos del Hardware y Software
Elementos del Hardware y Softwarecarlosadrianev
 
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
 
Comandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaComandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaAna Ruth G H
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friendflekoso
 
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
 
Curso de php practico
Curso de php practicoCurso de php practico
Curso de php practicoNeox Dark
 
Ruby Latin Developer20012010
Ruby Latin Developer20012010Ruby Latin Developer20012010
Ruby Latin Developer20012010Miguel Rodriguez
 

Similaire à Ruby (20)

Ruby
Ruby Ruby
Ruby
 
Ruby 01
Ruby 01Ruby 01
Ruby 01
 
Introducción a Ruby on Rails
Introducción a Ruby on RailsIntroducción a Ruby on Rails
Introducción a Ruby on Rails
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
 
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
Quiero hacer ágil, ¿y ahora qué: Java, Ruby o Scala?
 
Idiomatic Ruby
Idiomatic RubyIdiomatic Ruby
Idiomatic Ruby
 
Elementos del Hardware y Software
Elementos del Hardware y SoftwareElementos del Hardware y Software
Elementos del Hardware y Software
 
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
 
Tema2[php]
Tema2[php]Tema2[php]
Tema2[php]
 
01 el lenguaje Python
01 el lenguaje Python01 el lenguaje Python
01 el lenguaje Python
 
Python_Slides.pptx
Python_Slides.pptxPython_Slides.pptx
Python_Slides.pptx
 
Php Basico
Php BasicoPhp Basico
Php Basico
 
Comandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaComandos de Raptor,C# y Java
Comandos de Raptor,C# y Java
 
Perl2 arrays
Perl2 arraysPerl2 arrays
Perl2 arrays
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friend
 
IntroducciónPHP.pptx
IntroducciónPHP.pptxIntroducciónPHP.pptx
IntroducciónPHP.pptx
 
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...
 
Curso de php practico
Curso de php practicoCurso de php practico
Curso de php practico
 
Php
PhpPhp
Php
 
Ruby Latin Developer20012010
Ruby Latin Developer20012010Ruby Latin Developer20012010
Ruby Latin Developer20012010
 

Dernier

EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 

Dernier (12)

EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

Ruby

  • 1. DESARROLLO WEB AVANZADO Desarrollo rápido con Ruby on Rails Miguel Fernández Fernández miguel@ThirdWay.es
  • 3. Ruby es un lenguaje... Productivo Dinámico Orientado a objetos Funcional
  • 4. Ruby es Orientado a 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”] No existen tipos primitivos.Todos los literales son objetos 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 @y=y end def to_s "Punto (#{@x},#{@y})" end end origen=Punto.new(0,0) origen.x+=1 #igual que origen.x=origen.x+1 puts origen #=> Punto (1,0) ruby_oo.rb
  • 5. Ruby es dinámico No hay declaraciones explícitas de tipos 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 - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502 lista=[1,2,3,"Hola"] #ruby List<? extends Object> lista= Arrays.asList(1,2,"Hola"); //java duck_typing.rb
  • 6. Ruby es funcional En ruby todas las funciones pueden recibir un bloque, que es una función anónima. anonymous.java [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
  • 7. Ruby es funcional block_given? permite conocer si se ha pasado un bloque a una función y yield permite invocarlo. blocks.rb class Array def filtra filtrados=[] if block_given? each do |elemento| filtrados << elemento if yield elemento end filtrados else self end end end [1,2,3,4].filtra do |elemento| elemento % 2 == 0 end #=> [2,4] colores=%w{rojo amarillo azul verde} %w{el cielo es azul}.filtra do |palabra| colores.member? palabra end #=>["azul"]
  • 8. Ruby es un lenguaje productivo 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 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.
  • 9. Core API (at a glance) Cadenas y Símbolos Números Expresiones regulares http://www.ruby-doc.org/core/ Rangos, Listas y Diccionarios
  • 10. Números (Numeric & sons.) -123456 #Fixnum (negativo) 123_456 #Fixnum (se ignora '_') .4 #Float 2.3 #Float 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 Tipos Iteraciones 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) ranges.rb http://ruby-doc.org/core/classes/String.html A diferencia de la mayoría de los lenguajes de alto nivel, son objetos mutables # Comillas simples: no se evaluarán las expresiones #{} 'una cadena entre comillas #{"simples".upcase}' #=> una cadena entre comillas #{"simples".upcase} # Comillas dobles sí se evaluarán las expresiones #{} "una cadena entre comillas #{"dobles".upcase}" #=> una cadena entre comillas DOBLES #Varias líneas s=<<END Hola esto es un documento de texto en varias lineas END #Troceado de palabras %w{Hola mundo} #=> ["Hola", "mundo"] "Hip,"*2 + "hurray!" #=> Hip,Hip,hurray "Ruby, no es ... ".length # => 16 "Ruby, no es... ".split(/s*/) # => ["R", "u", "b", "y", ",", "n", "o", "e", "s", ".", ".", "."] "Ruby, no es python".scan(/ruby|python/i) # => ["Ruby", "python"] "Ruby, no es python".include?("python") #=>true "Ruby, no es python".end_with?("python") #=>true Ruby, no es python".gsub(/Ruby, no/i, "Python sí ") # => Python sí es python ✍
  • 12. Símbolos (Symbol) http://ruby-doc.org/core/classes/Symbol.html 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 b=:hola a.equal? b # => true a==b # => true a= "hola" b= "hola" a.equal? b # => false 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 ✍
  • 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) http://ruby-doc.org/core/classes/Array.html ✍ #Construcción vector=[1,"dos",3] vector=Array.new vector=[] #Accesso vector=[1,"dos",3] vector[0]="uno" vector # => ["uno", "dos", 3] #Índices negativos vector[-1] # => 3 #Acceso (out of bounds) vector[9082374] # => nil #Acceso (métodos especiales) vector.first # => "uno" vector.last # => "3" #Subconjuntos numeros=(0..9).to_a # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] numeros[3..6] # => [3, 4, 5, 6] numeros[-4..-1] # => [6, 7, 8, 9] numeros[-1..-4] # => [] rango no creciente numeros[0..5] = "x" # => ["x", 6, 7, 8, 9] #Comprobaciones [].empty? # => true [1,3].length # => 2 #Pilas pila=[] pila.push(1) pila.push(2,3) 3.times{ puts pila.pop } # imprime 3,2,1 #Colas cola=[] 3.times{|i| cola.push i+1} 3.times{|i| puts cola.shift} # imprime 1,2,3 #Conjuntos [1,2,3] & [2,2,3,4] #=> [2, 3]: Intersección [1,2,3] | [2,2,3,4] #=> [1, 2, 3, 4]:Unión [1,2,3] - [2,2,3,4] #=> [1]: Diferencia [1,2,3].include? 3 #=> true
  • 15. Diccionarios (Hash) http://ruby-doc.org/core/classes/Hash.html ✍ #Construcción animales = { :perro => "pluto", :pato => "donald", :raton => "mickey" } #Acceso (lee el valor) y lo modifica animales[:perro].upcase! animales # => {:perro=>"PLUTO", :pato=>"donald", :raton=>"mickey"} #Iteración animales.each_pair do |clave,valor| puts "El #{clave} se llama # {valor}" end #Paso de named parameters def http_request(url,args) default_args={ :method=>:get, :request_parameters=>{}, :http_headers=>{:accept=>"text/html"} } args=default_args.merge(args) do_request(args[:method],url,args[:request_parameters],args[:http_headers]) end def do_request(method,url,request_parameters,http_headers) puts %Q{ method =>#{method} url =>#{url} request parameters =>#{request_parameters} http_headers =>#{http_headers} } end http_request("http://www.gooogle.es") http_request("http://www.gooogle.es",:method=>:get) http_request("http://www.gooogle.es",:method=>:get, :request_parameters=> {:q=>"libros"})
  • 16. Expresiones regulares (Regexp) http://ruby-doc.org/core/classes/Regexp.html ✍ #Literales animal_domestico=/perro|gato|pajaro/i animal_domestico=Regexp.new("/perro|gato|pajaro") #Coincidencia "perro" === animal_domestico # => false (Case equality de String) animal_domestico === "perro" #=> true (Case equality de Regexp) #Aparición /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) #Matching mail=/^([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/i match=mail.match("miguelff@innova.uniovi.es") match[0] #=> miguelff@innova.uniovi.es match[1] #=> miguelff match[2] #=> innova.uniovi.es
  • 17. Control de flujo while / until if / unless / case - when
  • 18. if / unless http://ruby-doc.org/core/classes/Hash.html ✍ Toda expresión evalúa a true, excepto false y nil #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 if [expresion] #leer "si" "acción si expresión evalua a true" elsif [expresion2] "acción si expresion2 se evalua a true" else "acción si no si expresion y expresion 2 son falsas" end unless [expresion] #leer "a menos que" "accion si expresion evalua a false" else "acción si expresión se evalua a true" end
  • 19. case - when 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 case retorna la expresión del primer when que evalúa a true. 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 Gestión 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 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 • Crean espacios de nombres y previenen colisiones • Los módulos permiten articular mixins (herencia múltiple de comportamiento) Los módulos son una primitiva del lenguaje que permite agrupar métodos, clases, constantes, etc. modules.rb
  • 23. Train yourself http://www.rubyquiz.com/ 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 2 012345 -- -- -- -- | | | | | | | | | | | | | | | | -- -- -- -- | | | | | | | | | | | | | | -- -- -- -- > lcd.rb -s 1 6789 - - - - | | | | | | - - - | | | | | | - - -
  • 24. Referencias The Ruby Programming Language http://mislav.uniqpath.com/poignant-guide/ http://ruby-doc.org/core/
  • 26. DESARROLLO WEB AVANZADO Desarrollo rápido con Ruby on Rails Miguel Fernández Fernández miguel@ThirdWay.es