SlideShare una empresa de Scribd logo
1 de 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

Más contenido relacionado

La actualidad más candente

Lenguajes De Bajo Nivel
Lenguajes De Bajo NivelLenguajes De Bajo Nivel
Lenguajes De Bajo Nivelguestbf0046
 
Debug PaulinaChacon
Debug PaulinaChaconDebug PaulinaChacon
Debug PaulinaChaconPau22
 
La evolución histórica de los sistemas operativos
La evolución histórica de los sistemas operativosLa evolución histórica de los sistemas operativos
La evolución histórica de los sistemas operativosegonrea
 
Ejercicios Whule y Do While
Ejercicios Whule y Do WhileEjercicios Whule y Do While
Ejercicios Whule y Do WhileJoshe Varillas
 
Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)Maynor Mendoza
 
P. estructurada vs. programación orientada a objetos
P. estructurada vs. programación orientada a objetosP. estructurada vs. programación orientada a objetos
P. estructurada vs. programación orientada a objetosGeovanny Yungán
 
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
 
MAnual de php básico
MAnual de php básicoMAnual de php básico
MAnual de php básicoCleote
 
Exposicion base de datos DB2-IBM
Exposicion base de datos DB2-IBMExposicion base de datos DB2-IBM
Exposicion base de datos DB2-IBMJacob Gómez
 
Cadenas y funciones de cadena
Cadenas y funciones de cadenaCadenas y funciones de cadena
Cadenas y funciones de cadenaTensor
 
Estructuras Selectivas Simples, Dobles y Múltiples
Estructuras Selectivas Simples, Dobles y MúltiplesEstructuras Selectivas Simples, Dobles y Múltiples
Estructuras Selectivas Simples, Dobles y Múltiplesgladysurea2
 
Jose luisroisic6a 20042015
Jose luisroisic6a 20042015Jose luisroisic6a 20042015
Jose luisroisic6a 20042015JLuis Reyes Olea
 

La actualidad más candente (20)

Lenguajes De Bajo Nivel
Lenguajes De Bajo NivelLenguajes De Bajo Nivel
Lenguajes De Bajo Nivel
 
Debug PaulinaChacon
Debug PaulinaChaconDebug PaulinaChacon
Debug PaulinaChacon
 
La evolución histórica de los sistemas operativos
La evolución histórica de los sistemas operativosLa evolución histórica de los sistemas operativos
La evolución histórica de los sistemas operativos
 
Ejercicios Whule y Do While
Ejercicios Whule y Do WhileEjercicios Whule y Do While
Ejercicios Whule y Do While
 
Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)Ejercicios de programación en C (Estructuras condicionales-Selectivas)
Ejercicios de programación en C (Estructuras condicionales-Selectivas)
 
P. estructurada vs. programación orientada a objetos
P. estructurada vs. programación orientada a objetosP. estructurada vs. programación orientada a objetos
P. estructurada vs. 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
 
Ingenieria de software
Ingenieria de softwareIngenieria de software
Ingenieria de software
 
Manual de Uso PseInt
Manual de Uso PseIntManual de Uso PseInt
Manual de Uso PseInt
 
Herencia y polimorfismo
Herencia y polimorfismoHerencia y polimorfismo
Herencia y polimorfismo
 
Sintaxis del lenguaje c++
Sintaxis del lenguaje c++Sintaxis del lenguaje c++
Sintaxis del lenguaje c++
 
MAnual de php básico
MAnual de php básicoMAnual de php básico
MAnual de php básico
 
Exposicion base de datos DB2-IBM
Exposicion base de datos DB2-IBMExposicion base de datos DB2-IBM
Exposicion base de datos DB2-IBM
 
Lenguaje PHP
Lenguaje PHPLenguaje PHP
Lenguaje PHP
 
Componentes en-poo
Componentes en-pooComponentes en-poo
Componentes en-poo
 
Diagramas sintacticos
Diagramas sintacticosDiagramas sintacticos
Diagramas sintacticos
 
Visual Basic. Net
Visual Basic. NetVisual Basic. Net
Visual Basic. Net
 
Cadenas y funciones de cadena
Cadenas y funciones de cadenaCadenas y funciones de cadena
Cadenas y funciones de cadena
 
Estructuras Selectivas Simples, Dobles y Múltiples
Estructuras Selectivas Simples, Dobles y MúltiplesEstructuras Selectivas Simples, Dobles y Múltiples
Estructuras Selectivas Simples, Dobles y Múltiples
 
Jose luisroisic6a 20042015
Jose luisroisic6a 20042015Jose luisroisic6a 20042015
Jose luisroisic6a 20042015
 

Destacado

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
 

Destacado (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
 
Lenguaje de programación Ruby
Lenguaje de programación RubyLenguaje de programación Ruby
Lenguaje de programación Ruby
 
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
 

Similar a 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
 

Más 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
 

Más 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
 

Último

PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOFritz Rebaza Latoche
 
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesUNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesElianaCceresTorrico
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMONICADELROCIOMUNZON1
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfmatepura
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfalexquispenieto2
 
Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024CESARHERNANPATRICIOP2
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajasjuanprv
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILProblemSolved
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesMIGUELANGEL2658
 
01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt
01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt
01 MATERIALES AERONAUTICOS VARIOS clase 1.pptoscarvielma45
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdfvictoralejandroayala2
 
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
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfMikkaelNicolae
 
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfLA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfbcondort
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaXimenaFallaLecca1
 
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERAS
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERASDOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERAS
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERASPersonalJesusGranPod
 
clases de porcinos generales de porcinos
clases de porcinos generales de porcinosclases de porcinos generales de porcinos
clases de porcinos generales de porcinosDayanaCarolinaAP
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
Ingeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaIngeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaANACENIMENDEZ1
 

Último (20)

PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
 
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesUNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptx
 
ECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdfECONOMIA APLICADA SEMANA 555555555544.pdf
ECONOMIA APLICADA SEMANA 555555555544.pdf
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdf
 
Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024Base de Datos en Microsoft SQL Server 2024
Base de Datos en Microsoft SQL Server 2024
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajas
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias locales
 
01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt
01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt
01 MATERIALES AERONAUTICOS VARIOS clase 1.ppt
 
tema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdftema05 estabilidad en barras mecanicas.pdf
tema05 estabilidad en barras mecanicas.pdf
 
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
 
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdfReporte de simulación de flujo del agua en un volumen de control MNVA.pdf
Reporte de simulación de flujo del agua en un volumen de control MNVA.pdf
 
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdfLA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
LA APLICACIÓN DE LAS PROPIEDADES TEXTUALES A LOS TEXTOS.pdf
 
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO CersaSesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
Sesión 02 TIPOS DE VALORIZACIONES CURSO Cersa
 
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERAS
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERASDOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERAS
DOCUMENTO PLAN DE RESPUESTA A EMERGENCIAS MINERAS
 
clases de porcinos generales de porcinos
clases de porcinos generales de porcinosclases de porcinos generales de porcinos
clases de porcinos generales de porcinos
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
Ingeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedicaIngeniería clínica 1 Ingeniería biomedica
Ingeniería clínica 1 Ingeniería biomedica
 

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