SlideShare une entreprise Scribd logo
1  sur  59
Introducción a Ruby
Jose Emilio Labra Gayo
Depto. Informática
Universidad de Oviedo
Ruby
Creado en 1995 por Yukihiro Matsumoto (Matz)
Lenguaje Orientado a Objetos puro
Interpretado (desde 1.9 se compila a MV)
Tipos dinámicos
Matz, Fuente: Wikipedia
"Ruby is designed for programmer productivity and fun"
Compromiso
+Simplicidad -seguridad
+Productividad -rendimiento
Ecosistema
Página: https://www.ruby-lang.org
Implementaciones:
MRI (Matz Ruby Interpreter), JRuby, Rubinius, mruby...
Versiones en funcionamiento:
1.8 (2003), 1.9 (2007) , 2.0 (2013), 2.1 (2014)
Instalación:
RubyInstaller (Windows)
Bitnami Ruby Stack (bitnami.com)
Ecosistema
Intérprete/compilador: ruby
Intérprete interactivo: irb, pry
Gestión de paquetes: gem (rubygems.org)
Ayuda: ruby-doc.org
Entorno desarrollo:
Extensión Eclipse: Aptana
Rubymine
TDD - BDD
TDD (Test Driven Development)
Desarrollo basado en pruebas
BDD (Behaviour Driven Development)
Desarrollo basado en comportamiento
Especificaciones mediante ejemplos
Varios frameworks:
Cucumber, RSpec, etc.
RSpec
Crear los siguientes métodos
par(n) compruebe si un número es par
fact(n) devuelve el factorial de un nº
https://gist.github.com/labra/6fa18dc87cb72ed1f82d
Conceptos básicos
Ruby = Orientado a Objetos puro
Todo lo que se manipula son objetos
Herencia universal (... < Object < BasicObject)
...y mensajes entre objetos (aunque no lo parezca)
Ruby tiende a camuflar algunas cosas para ser más intuitivo
pepe.saluda("Hola")  pepe.send(:saluda,"Hola")
pepe.edad  pepe.send(:edad)
pepe.edad = 2  pepe.send(:edad=,2)
No hay tipos primitivos
Todo son objetos
23, "Hola", [1,2,3] son objetos
class: clase a la que pertenecen
superclass: superclase
"Hola".class # => String
"Hola".class.superclass # => Object
2.class # => FixNum
2.class.superclass # => Integer
[1,2,3].class # => Array
[1,2,3].class.superclass # => Object
Tipos
Ruby = tipado dinámico
Las variables no declaran el tipo
Las variables de instancia = nil hasta que se asignen
Tipos dinámicos: chequeo en tiempo de ejecución
x = "Hola" # => "Hola"
x.class # => String
x = 2 # => 2
x.class # => FixNum
x = 2 + "Pepe" # => TypeError: String can't be
# coerced into Fixnum
Sintaxis básica
Ruby = lenguaje orientado a una línea (scripting)
En general, expresiones terminan al final de la línea
; puede usarse para separar varias sentencias
No es necesario al final de las sentencias
Bloques de varias líneas
 indica que se necesita contenido en siguientes líneas
Algunas expresiones indicant que hace falta contenido
puts 2 # => 2
puts 2 + 3 # => 5
puts 2 +
3 # => 5 (no necesita )
puts 2 + 3 
+ 4 # => 9 (necesita )
Sintaxis básica
Todo consiste en enviar mensajes a objetos
objeto.send(mensaje,parámetros...)
Muchas simplificaciones para mayor claridad
pepe.crece  pepe.crece()  pepe.send(:crece)
f 2  f(2)  self.send(:f,2)
2 + 3  2.+(3)  2.send(:+,3)
a.should be >= 7  a.should(be() >= 7)  a.should(be.send(:>=,7))
Comentarios
Comentarios
Hasta fin de línea: # hasta fin de línea
Varias líneas (no es muy popular en Ruby)
=begin
varias líneas
=end
rdoc genera documentación
Identificadores
Clases y constantes = empiezan por mayúscula
String ActiveRecord DEBUG MAX_ROWS
Variables y métodos = empiezan por minúscula
Variables globales: empiezan por $
$nombre
Variables de instancia: por @
@nombre
Variables de clase (estáticos): por @@
@@cuentaPersonas
Símbolos (cadenas immutables): por :
:action
Convenciones
Variables y métodos: snake_case
Clases: CamelCase
Métodos booleanos suelen terminar en ?
empty?
Métodos peligrosos: terminan en !
reverse!, sort!
La definición de "peligrosos" es relativa
Suelen ser métodos que modifican objeto actual
pero no siempre es así...es una convención
Más información: http://goo.gl/VlPKhe
Objetos
Mediante constructor new se puede crear un objeto
class: devuelve la clase a la que pertenece
superclass: la superclase de una clase
methods: devuelve los métodos que tiene
def: permite definer métodos
self se refiere al objeto actual
objeto = Object.new # => #<Object:0x28f0458>
objeto.class #=> Object
objeto.class.superclass #=> BasicObject
objeto.methods #=> [:nil?, :class,...]
def objeto.saluda(nombre)
puts "Hola #{nombre}"
end # => nil
objeto.saluda("pepe") # => Hola pepe
Ejemplo creación objeto (sin clase)
Variables de instancia empiezan por @
juan = Object.new
juan.instance_variable_set(:@nombre,"Juan Manuel")
juan.instance_variable_set(:@edad,34)
def juan.crece
@edad = @edad + 1
end
def juan.getEdad
@edad
end
def juan.masViejo?(otro)
self.getEdad > otro.getEdad
end
Clases
Clase = plantilla para generar objetos
Variables de instancia, empiezan por @
class Persona
def initialize(nombre, edad)
@nombre = nombre
@edad = Integer(edad)
end
def to_s
"Persona: #{@nombre}, edad: #{@edad}"
end
def envejece
@edad = @edad + 1
end
end
juan = Persona.new("Juan", 30)
juan.envejece
puts juan #=> Persona: Juan, edad: 31
Herencia simple
Mediante <
class Usuario < Persona
def initialize(nombre, edad, email)
super(nombre,edad)
@email = email
end
def to_s
"Usuario: #{@nombre}, edad: #{@edad}, email: #{@email}"
end
def login(email)
email == @email
end
end
luis = Usuario.new("Luis", 24,"luis@mail.com")
luis.envejece
puts luis.login("luigi@mail.com") #=> false
Ejercicio: Figuras
Crear una clase Figura con 2 atributos (x,y)
Método que permita mover la figura
Crear una clase Rect para representar Rectángulos
Atributos a (ancho) y b (altura)
Crear una clase Circulo para representar Círculos
Atributo r (radio)
Crear método area para calcular el area
Crear método areas que calcula el area de una lista de
figuras
https://gist.github.com/labra/731f261deb9cc9c112a1
Estructuras de control
if...else...elsif..., unless
while
for
bloques/iteradores
Condicional
if...elsif...else...end
hoy = Time.now
if hoy.saturday?
puts "Salir"
elsif hoy.sunday?
puts "Dormir"
else
puts "Trabajar"
end
Condicional
Varias posibilidades
if...then...else...end en una línea
if al final
if !today.monday?
puts "Juerga"
end
if !today.monday? then puts "Juerga" end
puts "Juerga" if !today.monday? unless today.monday?
puts "Juerga"
end
puts "Juerga" unless today.monday?
unless = if not
Case
case...when...
edad = Random.rand(100)
case edad
when 0 .. 2
puts "bebé"
when 3 .. 6
puts "niño"
when 7 .. 12
puts "adolescente"
when 13 .. 18
puts "joven"
else
puts "adulto"
end
while
while...end
while linea = gets
puts linea.upcase
end
En una sola línea
x = 2
while x < 1000
x = x * x
end
x = 2
x = x * x while x < 1000
=
Ejercicio
Calcular los factores primos de un número
Ejemplo:
factores 1 = [1]
factores 2 = [1,2]
factores 3 = [1,3]
factores 4 = [1,2,2]
factores 5 = [1,5]
factores 6 = [1,2,3]
...
https://gist.github.com/labra/4a8b03b7dd5680eb09e1
Métodos
Los métodos se definen mediante def
Paso de parámetros por referencia
Puede haber parámetros por defecto
También se permite número variable de parámetros
Devuelve valor última sentencia
No suele necesitarse return
def tlfno(num, prefijo = "34")
prefijo + "-" + num
end
puts tlfno("985103000")
puts tlfno("234567781","01")
34-985103000
01-985103000
Bloques de código
Fragmentos de código entre {...} ó do...end
Se asocian a un método
Pueden tener parámetros. Sintaxis: |x|
yield: invoca el bloque asociado
Puede pasar argumentos
def saluda(nombre)
puts "Hola " + nombre
yield 1
yield 2
end
saluda("Pepe") {|n| puts "Recibo #{n}" }
Hola Pepe
Recibo un 1
Recibo un 2
Hola Juan
Recibo un 1
Recibo un 2
saluda("Juan") do |n|
puts "Recibo un #{n}"
end
Iteradores
Iterador = método que devuelve sucesivos
elementos a partir de una colección
Ejemplo each
[ 'juan', 'pepe', 'luis' ].each {|nombre| puts nombre }
3.times { puts "*" }
3.upto(6) {|i| puts i }
('a'..'d').each {|char| puts char }
Excepciones
raise: lanza una excepción
rescue: captura una excepción
def divide(x,y)
x = x / y
rescue ZeroDivisionError
"No se puede dividir por 0"
end
def divide(x,y)
if y == 0
raise "No puedo dividir por 0"
end
x / y
end
NOTA: Existen catch/throw pero tienen otro propósito
Clases predefinidas
Números
String
Arrays
Hash
nil
Expresiones regulares
Nota: Object, Class, Module son también clases
Números
FixNum: enteros (longitud fija)
BigNum: enteros (sin longitud determinada)
Float
También hay números racionales y complejos
num = 10001
4.times do
puts "#{num.class}: #{num}"
num *= num
end Fixnum: 10001
Fixnum: 100020001
Bignum: 10004000600040001
Bignum: 100080028005600700056002800080001
Números
Las operaciones convierten al tipo más general
1 + 2 # => 3
1 + 2.0 # => 3.0
1.0 + 2 # => 3.0
1.0 + Complex(1,2) # => (2.0+2i)
1 + Rational(2,3) # => (5/3)
1.0 + Rational(2,3) # => 1.6666666666666665
NOTA: La division entre enteros devuelve un entero por defecto
1.0 / 2 # => 0.5
1 / 2.0 # => 0.5
1 / 2 # => 0
Números
Bucles mediante números
3.times { print "X " } # => X X X
1.upto(5) {|i| print i, " " } # => 1 2 3 4 5
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
String
Varias formas de declarar cadenas:
Mediante "", '', %q, %Q
Interpolación #{ }
Delimitadores %
Cadenas HERE
pepe = "Jose Luis"
puts "hola #{pepe}"
puts 'hola #{pepe}'
cadena1 = %(
cadena de texto
con salto)
cadena2 = <<HERE
cadena de texto
literal
HERE
String
Múltiples métodos
downcase
uppercase
capitalize
chop
center
split
...
Métodos con ! cambian la cadena
Más información: http://ruby-doc.org/core-2.1.3/String.html
Colecciones: Arrays y Hashes
Colecciones indexadas de objetos
Diferencia:
Array: índice es un entero
Hash: índice es cualquier otro valor (array asociativo)
a = [23, 'gato', 3.14]
h = { :nombre => "Jose", :edad => 23, 0 => 5}
a[0] # => 23
a[4] # => nil
h[:nombre] # => "Jose"
h[0] # => 5
Arrays
Clase Array
Inicializar: Array.new(nº elementos,valorInicial)
Sintaxis especial mediante [ ]
frutas = ["Melocotones","Limones"]
frutas << "Manzanas"
frutas.push("Peras")
puts frutas[2] # => Manzanas
frutas.unshift("Naranjas")
p frutas #=> ["Naranjas", "Melocotones", "Limones", "Manzanas", "Peras"]
p frutas.sort #=> ["Limones", "Manzanas", "Melocotones", "Naranjas", "Peras"]
p frutas #=> ["Naranjas", "Melocotones", "Limones", "Manzanas", "Peras"]
frutas.sort!
p frutas #=> ["Limones", "Manzanas", "Melocotones", "Naranjas", "Peras"]
Más información: http://www.ruby-doc.org/core-2.1.3/Array.html
Arrays
Los elementos pueden ser de tipos diferentes
x = [1, 'gato', 3.14]
Ejercicio con Arrays
Modelar cursos con alumnos
Una clase curso compuesta por:
Nombre del curso
Lista de alumnos
Una clase alumno compuesta por
id del alumno
nota del alumno
Definir métodos de curso:
getNota(id)
ponNota(id,nota)
media
Curso Alumno
1..n1
https://gist.github.com/labra/7773beaf06a66fcd5424
Hashes
Arrays asociativos
Clave => Valor
No están ordenados
Simplificación sintáctica
Cuando es el último argumento de un método
link_to('Edit',{:controller=>'students', :action=>'edit'})
link_to 'Edit', :controller => 'students', :action => 'edit'
Más información: http://ruby-doc.org/core-2.1.3/Hash.html
Hashes
notas = { "juan" => 2.3, "luis" => 5.7 }
notas["pepe"] = 4
p notas # => {"juan"=>2.3, "luis"=>5.7, "pepe"=>4}
suma = 0
notas.each {|k,v|
suma += v
}
media = suma / notas.length
puts "Nota media: " + media.to_s # => Nota media: 4.0
Ejercicio Hashes y Arrays
Corregir exámenes. Aciertos: +1, fallos: -0.25
[ {"pregunta" => 1, "correcta" => "a"},
{"pregunta" => 2, "correcta" => "b"}]
[ {"alumno" => 2456,
"respuestas" => [{ "pregunta" => 1, "respuesta" => "a"},
{ "pregunta" => 2, "respuesta" => "b"}]},
{"alumno" => 4321,
"respuestas" => [{ "pregunta" => 1, "respuesta" => "b"},
{ "pregunta" => 2, "respuesta" => "b"}]}]
[ {"alumno" => 2456, "nota" => 2},
{"alumno" => 4321, "nota" => 0.75}]
https://gist.github.com/labra/c7209d569156bf3c9176
nil
Valor equivalente a falso
Las variables no inicializadas toman valor nil
x = Array.new
if x[1] then
puts "hay valor"
else
puts "No hay valor"
end
Expresiones regulares
Valores entre / y / son expresiones regulares
=~ intenta encajar
$1, $2,... toman el valor de los grupos encajados
email = "pepe@gmail.com"
if email =~ /^(.*)@(.*).com$/i
puts "encaja " + $1 + ' y ' + $2
else
puts "no encaja"
end
Simplificaciones
attr_accessor, attr_reader, attr_writer
class Persona
attr_reader :nombre
attr_accessor :edad
def initialize(nombre,edad)
@nombre = nombre
@edad = edad
end
end
pepe = Persona.new("Jose",23)
puts pepe.nombre # => Jose
puts pepe.edad # => 23
pepe.edad = 34
puts pepe.edad # => 34
pepe.nombre = "Juan" # undefined method `nombre='
traits mediante módulos
module Saludador
def saluda(msg)
puts "Hola: " + msg
end
end
class Persona
include Saludador
def initialize(nombre)
@nombre = nombre
end
end
pepe = Persona.new("Jose")
pepe.saluda("¿Qué tal?")
Variables estáticas (de clase)
Mediante @@
class Persona
@@cuentaPersonas = 0
def initialize(nombre)
@nombre = nombre
@@cuentaPersonas += 1
puts "#Personas: " + @@cuentaPersonas.to_s
end
end
pepe = Persona.new("Jose")
luis = Persona.new("Kiko")
mario = Persona.new("Mario")
Métodos estáticos (de clase)
Se indican mediante self.método
class Persona
def initialize(nombre)
@nombre = nombre
end
def self.doctor(nombre)
Persona.new("Doctor " + nombre)
end
def to_s
@nombre
end
end
pepe = Persona.doctor("Jose Luis")
puts pepe # => Doctor Jose Luis
Programación funcional en Ruby
Objetos Proc pueden invocarse mediante call
lambda = simplificación
suma3 = Proc.new { |x| x + 3 }
puts suma3.call(2) # => 5
suma3 = lambda { |x| x + 3 }
≡
aplica2 = lambda { |f,x| f.call(f.call(x)) }
puts aplica2(suma3,2) # => 8
suma3 = ->(x){ x + 3 }
Modularización
Módulos permiten separar espacio de nombres
M::a = elemento a de módulo M
module Universidad
class Profesor
def initialize(nombre)
@nombre = nombre
end
def to_s
@nombre
end
end
end
module Ayuntamiento
pepe = Universidad::Profesor.new("Jose")
puts pepe
end
module Ciudad
include Universidad
juan = Profesor.new("Juan")
puts juan
end
Gestión de dependencias
Inclusión de módulos
require
require_relative
Gestión de dependencias mediante gem
gem install
gem list
Gestión de tareas
rake
Organización y distribución
Estructura habitual de directorios
saluda/
bin/
saluda
lib/
saluda/
options.rb
main.rb
test/
saluda_spec.rb
saluda.gemspec
Ejemplo: https://github.com/cursosLabra/saludaRuby
Creación de gema: gem build saluda.gemspec
Metaprogramación
Programas que tratan otros programas como datos
Pueden acceder a partes de otros programas
Conocer aspectos del Sistema
Métodos tiene una clase, objetos existentes, etc.
Crear/modificar métodos o atributos en ejecución
"Métodos mágicos" que se invocan al vuelo
Asociar callbacks (hooks) a determinadas acciones
Cuando se crea una instancia, una subclase, etc.
...
Reflectividad
ObjectSpace información sobre objetos existentes
respond_to? chequea si admite mensaje
kind_of?, is_a? si pertenece a una clase (superclase)
instance_of? si es una instancia exacta de una clase
...y muchos más:
class, superclass, instance_methods,
private_instance_methods, class_variables, constants,
instance_variables,
Ejemplo de Metaprogramación
Añadir un atributo que recuerda los valores
class Class
def atributo_con_memoria(nombre)
nombre = nombre.to_s
attr_reader nombre
attr_reader nombre+"_valores"
class_eval %(
def #{nombre}=(val)
if @#{nombre+"_valores"}== nil
@#{nombre+"_valores"} = [nil, val]
else
@#{nombre+"_valores"} << val
end
@#{nombre}=val
end
)
end
end
class Persona
atributo_con_memoria :nombre
atributo_con_memoria :edad
end
juan = Persona.new
juan.nombre = "Juan"
juan.edad = 3
juan.nombre = "Juan Manuel"
print juan.nombre_valores
print juan.edad_valores
[nil, "Juan", "Juan Manuel"]
[nil, 3 ]
Ejemplo de metaprogramación
method_missing se ejecuta cuando no se encuentra un método
class Numeric
@@monedas = { 'euro' => 1, 'dolar' => 1.27 }
def method_missing(nombre_metodo)
moneda_singular = en_singular(nombre_metodo)
if @@monedas.has_key?(moneda_singular)
self * @@monedas[moneda_singular]
else
super
end
end
def en(moneda)
nombre = en_singular(moneda)
if @@monedas.has_key?(nombre)
self / @@monedas[nombre]
else
super
end
end
def en_singular(cadena)
cadena.to_s.gsub(/s$|es$/,'')
end
end
puts 5.dolares.en("euros") #=> 6.35
puts 20.euros.en("dolares") #=> 15.74
Usos de metaprogramación
attr_accessor, attr_reader, etc.
ActiveRecord en Ruby on Rails
class Album < ActiveRecord::Base
has_many :tracks
end
Técnicas Web en Ruby
Librerías: json, open-uri,...
Micro-framework: Sinatra
Web framework: Ruby on Rails
Referencias

Contenu connexe

Tendances

Presentacion Java
Presentacion JavaPresentacion Java
Presentacion Javamaeusogo
 
Polimorfismo y Clases Abstractas
Polimorfismo y Clases AbstractasPolimorfismo y Clases Abstractas
Polimorfismo y Clases Abstractascodigosyalgomas
 
Polimorfismo ppt
Polimorfismo  pptPolimorfismo  ppt
Polimorfismo pptivanvillar7
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosMario Villaseñor
 
Clase3 Programación Orientada a Objetos
Clase3 Programación Orientada a ObjetosClase3 Programación Orientada a Objetos
Clase3 Programación Orientada a Objetosdesimartinez
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacionalLuis Jherry
 
Programación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoProgramación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoAlvaro Enrique Ruano
 
11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()Clara Patricia Avella Ibañez
 
Programacion Orientada a Objetos en php
Programacion Orientada a Objetos en phpProgramacion Orientada a Objetos en php
Programacion Orientada a Objetos en phpSamuel Piñon Garcia
 
Programacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismoProgramacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismoJosé Antonio Sandoval Acosta
 

Tendances (20)

Presentacion Java
Presentacion JavaPresentacion Java
Presentacion Java
 
Polimorfismo y Clases Abstractas
Polimorfismo y Clases AbstractasPolimorfismo y Clases Abstractas
Polimorfismo y Clases Abstractas
 
Polimorfismo ppt
Polimorfismo  pptPolimorfismo  ppt
Polimorfismo ppt
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Programación Orientada a Objetos
Programación Orientada a ObjetosProgramación Orientada a Objetos
Programación Orientada a Objetos
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a Objetos
 
Clase3 Programación Orientada a Objetos
Clase3 Programación Orientada a ObjetosClase3 Programación Orientada a Objetos
Clase3 Programación Orientada a Objetos
 
Clase math.java
Clase math.javaClase math.java
Clase math.java
 
Algebra relacional
Algebra relacionalAlgebra relacional
Algebra relacional
 
Programación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoProgramación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismo
 
11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()
 
Programacion Orientada a Objetos en php
Programacion Orientada a Objetos en phpProgramacion Orientada a Objetos en php
Programacion Orientada a Objetos en php
 
Lenguaje de programación Ruby
Lenguaje de programación RubyLenguaje de programación Ruby
Lenguaje de programación Ruby
 
LibreríAs De Java
LibreríAs De JavaLibreríAs De Java
LibreríAs De Java
 
Programacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismoProgramacion Orientada a Objetos - Undiad 4 polimorfismo
Programacion Orientada a Objetos - Undiad 4 polimorfismo
 
Conceptos basicos POO
Conceptos basicos POOConceptos basicos POO
Conceptos basicos POO
 
Paradigmas de la programación
Paradigmas de la programación Paradigmas de la programación
Paradigmas de la programación
 
Polimorfismo y herencia
Polimorfismo y herenciaPolimorfismo y herencia
Polimorfismo y herencia
 
8.clases y objetos en c++
8.clases y objetos en c++8.clases y objetos en c++
8.clases y objetos en c++
 
Bootstrap
BootstrapBootstrap
Bootstrap
 

En vedette

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 Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsDesarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsErnesto Jiménez
 
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
 
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
 
CSS Preprocessors - Sass
CSS Preprocessors - SassCSS Preprocessors - Sass
CSS Preprocessors - SassLourdes Montano
 
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
 
RDF Validation Future work and applications
RDF Validation Future work and applicationsRDF Validation Future work and applications
RDF Validation Future work and applicationsJose Emilio Labra Gayo
 

En vedette (20)

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 Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on RailsDesarrollo Ágil y Ruby on Rails
Desarrollo Ágil y Ruby on Rails
 
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
 
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
 
CSS Preprocessors - Sass
CSS Preprocessors - SassCSS Preprocessors - Sass
CSS Preprocessors - Sass
 
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
 
Ruby intro
Ruby introRuby intro
Ruby intro
 
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
 
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
 
Data shapes-test-suite
Data shapes-test-suiteData shapes-test-suite
Data shapes-test-suite
 
RDF data model
RDF data modelRDF data model
RDF data model
 
RDF Validation Future work and applications
RDF Validation Future work and applicationsRDF Validation Future work and applications
RDF Validation Future work and applications
 
ShEx vs SHACL
ShEx vs SHACLShEx vs SHACL
ShEx vs SHACL
 
Ruby Facil
Ruby FacilRuby Facil
Ruby Facil
 

Similaire à 2 Introducción al lenguaje Ruby (20)

4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Python para principiantes
Python para principiantesPython para principiantes
Python para principiantes
 
Ruby i
Ruby iRuby i
Ruby i
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Ruby 01
Ruby 01Ruby 01
Ruby 01
 
Ruby
Ruby Ruby
Ruby
 
Php
PhpPhp
Php
 
Ruby
RubyRuby
Ruby
 
Python3000
Python3000Python3000
Python3000
 
Matlab basico
Matlab basicoMatlab basico
Matlab basico
 
0139-php-y-mysql-lenguaje-php-basico.pdf
0139-php-y-mysql-lenguaje-php-basico.pdf0139-php-y-mysql-lenguaje-php-basico.pdf
0139-php-y-mysql-lenguaje-php-basico.pdf
 
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...
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
resumen matlab
resumen matlabresumen matlab
resumen matlab
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Introducción a la programación en Python
Introducción a la programación en PythonIntroducción a la programación en Python
Introducción a la programación en Python
 
Python workshop
Python workshopPython workshop
Python workshop
 
Separata java script
Separata java scriptSeparata java script
Separata java script
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 

Plus de Jose Emilio Labra Gayo

Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctoradoJose Emilio Labra Gayo
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapesJose Emilio Labra Gayo
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data qualityJose Emilio Labra Gayo
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesJose Emilio Labra Gayo
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesJose Emilio Labra Gayo
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosJose Emilio Labra Gayo
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorJose Emilio Labra Gayo
 

Plus de Jose Emilio Labra Gayo (20)

Publicaciones de investigación
Publicaciones de investigaciónPublicaciones de investigación
Publicaciones de investigación
 
Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctorado
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapes
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data quality
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectives
 
Wikidata
WikidataWikidata
Wikidata
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologies
 
ShEx by Example
ShEx by ExampleShEx by Example
ShEx by Example
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
Introducción a la Web Semántica
Introducción a la Web SemánticaIntroducción a la Web Semántica
Introducción a la Web Semántica
 
RDF Data Model
RDF Data ModelRDF Data Model
RDF Data Model
 
2017 Tendencias en informática
2017 Tendencias en informática2017 Tendencias en informática
2017 Tendencias en informática
 
RDF, linked data and semantic web
RDF, linked data and semantic webRDF, linked data and semantic web
RDF, linked data and semantic web
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazados
 
16 Alternativas XML
16 Alternativas XML16 Alternativas XML
16 Alternativas XML
 
XSLT
XSLTXSLT
XSLT
 
XPath
XPathXPath
XPath
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el Servidor
 

Dernier

Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfyoseka196
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...RichardRivas28
 
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptx
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptxPPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptx
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptxSergioGJimenezMorean
 
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptx
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptxProcesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptx
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptxJuanPablo452634
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptCRISTOFERSERGIOCANAL
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASfranzEmersonMAMANIOC
 
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptMarianoSanchez70
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdfCristhianZetaNima
 
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfCurso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfcesar17lavictoria
 
presentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricopresentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricoalexcala5
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdfFernandaGarca788912
 
Magnetismo y electromagnetismo principios
Magnetismo y electromagnetismo principiosMagnetismo y electromagnetismo principios
Magnetismo y electromagnetismo principiosMarceloQuisbert6
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxbingoscarlet
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdfvictoralejandroayala2
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptEduardoCorado
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacajeremiasnifla
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdffredyflores58
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdfevin1703e
 

Dernier (20)

Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdf
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
 
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptx
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptxPPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptx
PPT SERVIDOR ESCUELA PERU EDUCA LINUX v7.pptx
 
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptx
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptxProcesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptx
Procesos-de-la-Industria-Alimentaria-Envasado-en-la-Produccion-de-Alimentos.pptx
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
 
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
 
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdfCurso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
Curso Análisis Fisicoquímico y Microbiológico de Aguas -EAI - SESIÓN 5.pdf
 
presentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricopresentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctrico
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
Curso intensivo de soldadura electrónica en pdf
Curso intensivo de soldadura electrónica  en pdfCurso intensivo de soldadura electrónica  en pdf
Curso intensivo de soldadura electrónica en pdf
 
Magnetismo y electromagnetismo principios
Magnetismo y electromagnetismo principiosMagnetismo y electromagnetismo principios
Magnetismo y electromagnetismo principios
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptx
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdf
 
Introducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.pptIntroducción a los sistemas neumaticos.ppt
Introducción a los sistemas neumaticos.ppt
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpaca
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdf
 

2 Introducción al lenguaje Ruby

  • 1. Introducción a Ruby Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo
  • 2. Ruby Creado en 1995 por Yukihiro Matsumoto (Matz) Lenguaje Orientado a Objetos puro Interpretado (desde 1.9 se compila a MV) Tipos dinámicos Matz, Fuente: Wikipedia "Ruby is designed for programmer productivity and fun" Compromiso +Simplicidad -seguridad +Productividad -rendimiento
  • 3. Ecosistema Página: https://www.ruby-lang.org Implementaciones: MRI (Matz Ruby Interpreter), JRuby, Rubinius, mruby... Versiones en funcionamiento: 1.8 (2003), 1.9 (2007) , 2.0 (2013), 2.1 (2014) Instalación: RubyInstaller (Windows) Bitnami Ruby Stack (bitnami.com)
  • 4. Ecosistema Intérprete/compilador: ruby Intérprete interactivo: irb, pry Gestión de paquetes: gem (rubygems.org) Ayuda: ruby-doc.org Entorno desarrollo: Extensión Eclipse: Aptana Rubymine
  • 5. TDD - BDD TDD (Test Driven Development) Desarrollo basado en pruebas BDD (Behaviour Driven Development) Desarrollo basado en comportamiento Especificaciones mediante ejemplos Varios frameworks: Cucumber, RSpec, etc.
  • 6. RSpec Crear los siguientes métodos par(n) compruebe si un número es par fact(n) devuelve el factorial de un nº https://gist.github.com/labra/6fa18dc87cb72ed1f82d
  • 7. Conceptos básicos Ruby = Orientado a Objetos puro Todo lo que se manipula son objetos Herencia universal (... < Object < BasicObject) ...y mensajes entre objetos (aunque no lo parezca) Ruby tiende a camuflar algunas cosas para ser más intuitivo pepe.saluda("Hola")  pepe.send(:saluda,"Hola") pepe.edad  pepe.send(:edad) pepe.edad = 2  pepe.send(:edad=,2)
  • 8. No hay tipos primitivos Todo son objetos 23, "Hola", [1,2,3] son objetos class: clase a la que pertenecen superclass: superclase "Hola".class # => String "Hola".class.superclass # => Object 2.class # => FixNum 2.class.superclass # => Integer [1,2,3].class # => Array [1,2,3].class.superclass # => Object
  • 9. Tipos Ruby = tipado dinámico Las variables no declaran el tipo Las variables de instancia = nil hasta que se asignen Tipos dinámicos: chequeo en tiempo de ejecución x = "Hola" # => "Hola" x.class # => String x = 2 # => 2 x.class # => FixNum x = 2 + "Pepe" # => TypeError: String can't be # coerced into Fixnum
  • 10. Sintaxis básica Ruby = lenguaje orientado a una línea (scripting) En general, expresiones terminan al final de la línea ; puede usarse para separar varias sentencias No es necesario al final de las sentencias Bloques de varias líneas indica que se necesita contenido en siguientes líneas Algunas expresiones indicant que hace falta contenido puts 2 # => 2 puts 2 + 3 # => 5 puts 2 + 3 # => 5 (no necesita ) puts 2 + 3 + 4 # => 9 (necesita )
  • 11. Sintaxis básica Todo consiste en enviar mensajes a objetos objeto.send(mensaje,parámetros...) Muchas simplificaciones para mayor claridad pepe.crece  pepe.crece()  pepe.send(:crece) f 2  f(2)  self.send(:f,2) 2 + 3  2.+(3)  2.send(:+,3) a.should be >= 7  a.should(be() >= 7)  a.should(be.send(:>=,7))
  • 12. Comentarios Comentarios Hasta fin de línea: # hasta fin de línea Varias líneas (no es muy popular en Ruby) =begin varias líneas =end rdoc genera documentación
  • 13. Identificadores Clases y constantes = empiezan por mayúscula String ActiveRecord DEBUG MAX_ROWS Variables y métodos = empiezan por minúscula Variables globales: empiezan por $ $nombre Variables de instancia: por @ @nombre Variables de clase (estáticos): por @@ @@cuentaPersonas Símbolos (cadenas immutables): por : :action
  • 14. Convenciones Variables y métodos: snake_case Clases: CamelCase Métodos booleanos suelen terminar en ? empty? Métodos peligrosos: terminan en ! reverse!, sort! La definición de "peligrosos" es relativa Suelen ser métodos que modifican objeto actual pero no siempre es así...es una convención Más información: http://goo.gl/VlPKhe
  • 15. Objetos Mediante constructor new se puede crear un objeto class: devuelve la clase a la que pertenece superclass: la superclase de una clase methods: devuelve los métodos que tiene def: permite definer métodos self se refiere al objeto actual objeto = Object.new # => #<Object:0x28f0458> objeto.class #=> Object objeto.class.superclass #=> BasicObject objeto.methods #=> [:nil?, :class,...] def objeto.saluda(nombre) puts "Hola #{nombre}" end # => nil objeto.saluda("pepe") # => Hola pepe
  • 16. Ejemplo creación objeto (sin clase) Variables de instancia empiezan por @ juan = Object.new juan.instance_variable_set(:@nombre,"Juan Manuel") juan.instance_variable_set(:@edad,34) def juan.crece @edad = @edad + 1 end def juan.getEdad @edad end def juan.masViejo?(otro) self.getEdad > otro.getEdad end
  • 17. Clases Clase = plantilla para generar objetos Variables de instancia, empiezan por @ class Persona def initialize(nombre, edad) @nombre = nombre @edad = Integer(edad) end def to_s "Persona: #{@nombre}, edad: #{@edad}" end def envejece @edad = @edad + 1 end end juan = Persona.new("Juan", 30) juan.envejece puts juan #=> Persona: Juan, edad: 31
  • 18. Herencia simple Mediante < class Usuario < Persona def initialize(nombre, edad, email) super(nombre,edad) @email = email end def to_s "Usuario: #{@nombre}, edad: #{@edad}, email: #{@email}" end def login(email) email == @email end end luis = Usuario.new("Luis", 24,"luis@mail.com") luis.envejece puts luis.login("luigi@mail.com") #=> false
  • 19. Ejercicio: Figuras Crear una clase Figura con 2 atributos (x,y) Método que permita mover la figura Crear una clase Rect para representar Rectángulos Atributos a (ancho) y b (altura) Crear una clase Circulo para representar Círculos Atributo r (radio) Crear método area para calcular el area Crear método areas que calcula el area de una lista de figuras https://gist.github.com/labra/731f261deb9cc9c112a1
  • 20. Estructuras de control if...else...elsif..., unless while for bloques/iteradores
  • 21. Condicional if...elsif...else...end hoy = Time.now if hoy.saturday? puts "Salir" elsif hoy.sunday? puts "Dormir" else puts "Trabajar" end
  • 22. Condicional Varias posibilidades if...then...else...end en una línea if al final if !today.monday? puts "Juerga" end if !today.monday? then puts "Juerga" end puts "Juerga" if !today.monday? unless today.monday? puts "Juerga" end puts "Juerga" unless today.monday? unless = if not
  • 23. Case case...when... edad = Random.rand(100) case edad when 0 .. 2 puts "bebé" when 3 .. 6 puts "niño" when 7 .. 12 puts "adolescente" when 13 .. 18 puts "joven" else puts "adulto" end
  • 24. while while...end while linea = gets puts linea.upcase end En una sola línea x = 2 while x < 1000 x = x * x end x = 2 x = x * x while x < 1000 =
  • 25. Ejercicio Calcular los factores primos de un número Ejemplo: factores 1 = [1] factores 2 = [1,2] factores 3 = [1,3] factores 4 = [1,2,2] factores 5 = [1,5] factores 6 = [1,2,3] ... https://gist.github.com/labra/4a8b03b7dd5680eb09e1
  • 26. Métodos Los métodos se definen mediante def Paso de parámetros por referencia Puede haber parámetros por defecto También se permite número variable de parámetros Devuelve valor última sentencia No suele necesitarse return def tlfno(num, prefijo = "34") prefijo + "-" + num end puts tlfno("985103000") puts tlfno("234567781","01") 34-985103000 01-985103000
  • 27. Bloques de código Fragmentos de código entre {...} ó do...end Se asocian a un método Pueden tener parámetros. Sintaxis: |x| yield: invoca el bloque asociado Puede pasar argumentos def saluda(nombre) puts "Hola " + nombre yield 1 yield 2 end saluda("Pepe") {|n| puts "Recibo #{n}" } Hola Pepe Recibo un 1 Recibo un 2 Hola Juan Recibo un 1 Recibo un 2 saluda("Juan") do |n| puts "Recibo un #{n}" end
  • 28. Iteradores Iterador = método que devuelve sucesivos elementos a partir de una colección Ejemplo each [ 'juan', 'pepe', 'luis' ].each {|nombre| puts nombre } 3.times { puts "*" } 3.upto(6) {|i| puts i } ('a'..'d').each {|char| puts char }
  • 29. Excepciones raise: lanza una excepción rescue: captura una excepción def divide(x,y) x = x / y rescue ZeroDivisionError "No se puede dividir por 0" end def divide(x,y) if y == 0 raise "No puedo dividir por 0" end x / y end NOTA: Existen catch/throw pero tienen otro propósito
  • 31. Números FixNum: enteros (longitud fija) BigNum: enteros (sin longitud determinada) Float También hay números racionales y complejos num = 10001 4.times do puts "#{num.class}: #{num}" num *= num end Fixnum: 10001 Fixnum: 100020001 Bignum: 10004000600040001 Bignum: 100080028005600700056002800080001
  • 32. Números Las operaciones convierten al tipo más general 1 + 2 # => 3 1 + 2.0 # => 3.0 1.0 + 2 # => 3.0 1.0 + Complex(1,2) # => (2.0+2i) 1 + Rational(2,3) # => (5/3) 1.0 + Rational(2,3) # => 1.6666666666666665 NOTA: La division entre enteros devuelve un entero por defecto 1.0 / 2 # => 0.5 1 / 2.0 # => 0.5 1 / 2 # => 0
  • 33. Números Bucles mediante números 3.times { print "X " } # => X X X 1.upto(5) {|i| print i, " " } # => 1 2 3 4 5 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
  • 34. String Varias formas de declarar cadenas: Mediante "", '', %q, %Q Interpolación #{ } Delimitadores % Cadenas HERE pepe = "Jose Luis" puts "hola #{pepe}" puts 'hola #{pepe}' cadena1 = %( cadena de texto con salto) cadena2 = <<HERE cadena de texto literal HERE
  • 35. String Múltiples métodos downcase uppercase capitalize chop center split ... Métodos con ! cambian la cadena Más información: http://ruby-doc.org/core-2.1.3/String.html
  • 36. Colecciones: Arrays y Hashes Colecciones indexadas de objetos Diferencia: Array: índice es un entero Hash: índice es cualquier otro valor (array asociativo) a = [23, 'gato', 3.14] h = { :nombre => "Jose", :edad => 23, 0 => 5} a[0] # => 23 a[4] # => nil h[:nombre] # => "Jose" h[0] # => 5
  • 37. Arrays Clase Array Inicializar: Array.new(nº elementos,valorInicial) Sintaxis especial mediante [ ] frutas = ["Melocotones","Limones"] frutas << "Manzanas" frutas.push("Peras") puts frutas[2] # => Manzanas frutas.unshift("Naranjas") p frutas #=> ["Naranjas", "Melocotones", "Limones", "Manzanas", "Peras"] p frutas.sort #=> ["Limones", "Manzanas", "Melocotones", "Naranjas", "Peras"] p frutas #=> ["Naranjas", "Melocotones", "Limones", "Manzanas", "Peras"] frutas.sort! p frutas #=> ["Limones", "Manzanas", "Melocotones", "Naranjas", "Peras"] Más información: http://www.ruby-doc.org/core-2.1.3/Array.html
  • 38. Arrays Los elementos pueden ser de tipos diferentes x = [1, 'gato', 3.14]
  • 39. Ejercicio con Arrays Modelar cursos con alumnos Una clase curso compuesta por: Nombre del curso Lista de alumnos Una clase alumno compuesta por id del alumno nota del alumno Definir métodos de curso: getNota(id) ponNota(id,nota) media Curso Alumno 1..n1 https://gist.github.com/labra/7773beaf06a66fcd5424
  • 40. Hashes Arrays asociativos Clave => Valor No están ordenados Simplificación sintáctica Cuando es el último argumento de un método link_to('Edit',{:controller=>'students', :action=>'edit'}) link_to 'Edit', :controller => 'students', :action => 'edit' Más información: http://ruby-doc.org/core-2.1.3/Hash.html
  • 41. Hashes notas = { "juan" => 2.3, "luis" => 5.7 } notas["pepe"] = 4 p notas # => {"juan"=>2.3, "luis"=>5.7, "pepe"=>4} suma = 0 notas.each {|k,v| suma += v } media = suma / notas.length puts "Nota media: " + media.to_s # => Nota media: 4.0
  • 42. Ejercicio Hashes y Arrays Corregir exámenes. Aciertos: +1, fallos: -0.25 [ {"pregunta" => 1, "correcta" => "a"}, {"pregunta" => 2, "correcta" => "b"}] [ {"alumno" => 2456, "respuestas" => [{ "pregunta" => 1, "respuesta" => "a"}, { "pregunta" => 2, "respuesta" => "b"}]}, {"alumno" => 4321, "respuestas" => [{ "pregunta" => 1, "respuesta" => "b"}, { "pregunta" => 2, "respuesta" => "b"}]}] [ {"alumno" => 2456, "nota" => 2}, {"alumno" => 4321, "nota" => 0.75}] https://gist.github.com/labra/c7209d569156bf3c9176
  • 43. nil Valor equivalente a falso Las variables no inicializadas toman valor nil x = Array.new if x[1] then puts "hay valor" else puts "No hay valor" end
  • 44. Expresiones regulares Valores entre / y / son expresiones regulares =~ intenta encajar $1, $2,... toman el valor de los grupos encajados email = "pepe@gmail.com" if email =~ /^(.*)@(.*).com$/i puts "encaja " + $1 + ' y ' + $2 else puts "no encaja" end
  • 45. Simplificaciones attr_accessor, attr_reader, attr_writer class Persona attr_reader :nombre attr_accessor :edad def initialize(nombre,edad) @nombre = nombre @edad = edad end end pepe = Persona.new("Jose",23) puts pepe.nombre # => Jose puts pepe.edad # => 23 pepe.edad = 34 puts pepe.edad # => 34 pepe.nombre = "Juan" # undefined method `nombre='
  • 46. traits mediante módulos module Saludador def saluda(msg) puts "Hola: " + msg end end class Persona include Saludador def initialize(nombre) @nombre = nombre end end pepe = Persona.new("Jose") pepe.saluda("¿Qué tal?")
  • 47. Variables estáticas (de clase) Mediante @@ class Persona @@cuentaPersonas = 0 def initialize(nombre) @nombre = nombre @@cuentaPersonas += 1 puts "#Personas: " + @@cuentaPersonas.to_s end end pepe = Persona.new("Jose") luis = Persona.new("Kiko") mario = Persona.new("Mario")
  • 48. Métodos estáticos (de clase) Se indican mediante self.método class Persona def initialize(nombre) @nombre = nombre end def self.doctor(nombre) Persona.new("Doctor " + nombre) end def to_s @nombre end end pepe = Persona.doctor("Jose Luis") puts pepe # => Doctor Jose Luis
  • 49. Programación funcional en Ruby Objetos Proc pueden invocarse mediante call lambda = simplificación suma3 = Proc.new { |x| x + 3 } puts suma3.call(2) # => 5 suma3 = lambda { |x| x + 3 } ≡ aplica2 = lambda { |f,x| f.call(f.call(x)) } puts aplica2(suma3,2) # => 8 suma3 = ->(x){ x + 3 }
  • 50. Modularización Módulos permiten separar espacio de nombres M::a = elemento a de módulo M module Universidad class Profesor def initialize(nombre) @nombre = nombre end def to_s @nombre end end end module Ayuntamiento pepe = Universidad::Profesor.new("Jose") puts pepe end module Ciudad include Universidad juan = Profesor.new("Juan") puts juan end
  • 51. Gestión de dependencias Inclusión de módulos require require_relative Gestión de dependencias mediante gem gem install gem list Gestión de tareas rake
  • 52. Organización y distribución Estructura habitual de directorios saluda/ bin/ saluda lib/ saluda/ options.rb main.rb test/ saluda_spec.rb saluda.gemspec Ejemplo: https://github.com/cursosLabra/saludaRuby Creación de gema: gem build saluda.gemspec
  • 53. Metaprogramación Programas que tratan otros programas como datos Pueden acceder a partes de otros programas Conocer aspectos del Sistema Métodos tiene una clase, objetos existentes, etc. Crear/modificar métodos o atributos en ejecución "Métodos mágicos" que se invocan al vuelo Asociar callbacks (hooks) a determinadas acciones Cuando se crea una instancia, una subclase, etc. ...
  • 54. Reflectividad ObjectSpace información sobre objetos existentes respond_to? chequea si admite mensaje kind_of?, is_a? si pertenece a una clase (superclase) instance_of? si es una instancia exacta de una clase ...y muchos más: class, superclass, instance_methods, private_instance_methods, class_variables, constants, instance_variables,
  • 55. Ejemplo de Metaprogramación Añadir un atributo que recuerda los valores class Class def atributo_con_memoria(nombre) nombre = nombre.to_s attr_reader nombre attr_reader nombre+"_valores" class_eval %( def #{nombre}=(val) if @#{nombre+"_valores"}== nil @#{nombre+"_valores"} = [nil, val] else @#{nombre+"_valores"} << val end @#{nombre}=val end ) end end class Persona atributo_con_memoria :nombre atributo_con_memoria :edad end juan = Persona.new juan.nombre = "Juan" juan.edad = 3 juan.nombre = "Juan Manuel" print juan.nombre_valores print juan.edad_valores [nil, "Juan", "Juan Manuel"] [nil, 3 ]
  • 56. Ejemplo de metaprogramación method_missing se ejecuta cuando no se encuentra un método class Numeric @@monedas = { 'euro' => 1, 'dolar' => 1.27 } def method_missing(nombre_metodo) moneda_singular = en_singular(nombre_metodo) if @@monedas.has_key?(moneda_singular) self * @@monedas[moneda_singular] else super end end def en(moneda) nombre = en_singular(moneda) if @@monedas.has_key?(nombre) self / @@monedas[nombre] else super end end def en_singular(cadena) cadena.to_s.gsub(/s$|es$/,'') end end puts 5.dolares.en("euros") #=> 6.35 puts 20.euros.en("dolares") #=> 15.74
  • 57. Usos de metaprogramación attr_accessor, attr_reader, etc. ActiveRecord en Ruby on Rails class Album < ActiveRecord::Base has_many :tracks end
  • 58. Técnicas Web en Ruby Librerías: json, open-uri,... Micro-framework: Sinatra Web framework: Ruby on Rails