19. Introducción al lenguaje: Ruby
Yukihiro Matsumoto
Perl + Smaltalk + Eiffel + Ada + Lisp
Ruby
(1995)
-> Multiparadígma + Interpretado + Dinámico + Tipado
“Pretende ser un lenguaje natural, no sencillo”
20. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
21. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
22. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
2) Ejecución:
– Irb → consola de Ruby
23. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
2) Ejecución:
– Irb → consola de Ruby
– Scripts → *.rb
24. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
2) Ejecución:
– Irb → consola de Ruby
– Scripts → *.rb
– Entornos Web → Ruby on Rails
25. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
2) Ejecución:
– Irb → consola de Ruby
– Scripts → *.rb
– Entornos Web → Ruby on Rails
3) Herramientas: ¿IDE o no IDE?
– Radrails, RubyGem, Netbeans,...
26. El Entorno de Ruby
1) Instalación:
– Simple → instalación como paquete del sistema
– RVM → gestor de entornos Ruby
2) Ejecución:
– Irb → consola de Ruby
– Scripts → *.rb
– Entornos Web → Ruby on Rails
3) Herramientas: ¿IDE o no IDE?
– Radrails, RubyGem, Netbeans,...
– ¡¡VIM!!
35. Conceptos Básicos
2) Funciones
- Estructura:
def [nombre de la función] ([lista de parámetros])
…..
end
- Ejemplo:
def par? (x)
x%2==0
end
36. Conceptos Básicos
2) Funciones
- Estructura:
def [nombre de la función] ([lista de parámetros])
…..
end
- Ejemplo:
def par? (x)
x%2==0
end
Y el Return???
40. Conceptos Básicos
3) Búcles:
- Tenemos:
while [bool-exp] do for [VAR] in [Array] do
--- ---
end end
[Exp].each do [|Var|]
---
end
41. Conceptos Básicos
3) Búcles:
- Tenemos:
while [bool-exp] do for [VAR] in [Array] do
--- ---
end end
[Exp].each do [|Var|] [Integer].times do
--- ---
end end
42. Conceptos Básicos
3) Búcles:
- Tenemos:
while [bool-exp] do for [VAR] in [Array] do
--- ---
end end
loop do
….
end [Integer].times do
[Exp].each do [|Var|]
--- ---
end end
47. Conceptos Básicos
4) Condicionales:
- Tenemos:
if [bool-exp] do
if [bool-exp] do …
--- else
end …
end
unless [bool-exp] [exp]? Ac1 : Ac2
do
--- [Action] if [Exp]
end ...
50. OOP: clases, módulos y mixins
1) Clases:
- Declaración:
class [Nombre_clase]
...
end
- Ejemplo:
class Coche
# Declaración de atributos y acesos
def initialize([parametros])
#Incializamos atributos de instancia y de clase
end
end
51. OOP: clases, módulos y mixins
1) Clases:
- Ejemplo:
class Coche
@@coches = 0 # Atributos de clase
RUEDAS = 4 # Constantes
attr_accessor :color,:modelo # Acceso a atributos
def initialize(color, modelo)
@color = color
@modelo = modelo
@@coches += 1
end
…
end
52. OOP: clases, módulos y mixins
2) Módulos:
- Declaración:
module [NombreModelo]
…
end
- Ejemplo:
module Acciones
def cambiar_rueda
puts “rueda cambiada con éxito!!”
end
end
53. OOP: clases, módulos y mixins
2) Módulos:
- Ejemplo:
module Acciones
MAX_REP = 3
def cambiar_rueda
puts “rueda cambiada con éxito!!”
end
def self.hola
puts “hola estoy es un modulo”
end
end
55. OOP: clases, módulos y mixins
3) Mixin:
- ¿Qué es?:
Super
Class
Herencia
Simple
Class
56. OOP: clases, módulos y mixins
3) Mixin:
- ¿Qué es?:
¡¡¡MIXIN!!!
}
Super
Class module 1
Herencia module 2
Simple . Include OR extends
Class .
.
module N
58. Bloques, Proc y Lambda
1) Bloques:
- ¿Qué es?:
Piezas de código que se manejan como variables.
Ej.-
class Klase
def metodo_1(&block) #Pasamos por parámetros el bloque
block.call
end
end
k = Klase.new
k.method_1 do
p “Hola a todos”
end
59. Bloques, Proc y Lambda
2) Proc:
- ¿Qué es?:
Piezas de código que se almacenan en variables.
Ej.-
class Klase
def metodo_1(proc) #Pasamos por parámetros el Proc
proc.call
end
end
k = Klase.new
proc = Proc.new{
p “Hola a todos”
}
k.method_1 proc
60. Bloques, Proc y Lambda
3) Lambda:
- ¿Qué es?:
Piezas de código que se almacenan en variables.
Ej.-
class Klase
def metodo_1(proc) #Pasamos por parámetros el Proc
proc.call
end
end
k = Klase.new
proc = Proc.new{
p “Hola a todos”
}
k.method_1 proc
61. Bloques, Proc y Lambda
Block Vs Proc:
- Block piezas de código que puedes hacer paso por
referencia.
- Su almacenamiento es efímero.
- Proc permite almacenar piezas de código en variables.
- Usarse múltiples veces.
- Pasar como parámetros a métodos y funciones.
62. Bloques, Proc y Lambda
Proc Vs Lambda:
- Proc no comprueba el numero de parámetros de
entrada. Lambda si comprueba parámetros de entrada.
p = Proc.new{|a, b, c| puts “El valor de a es #{a} y b es #{b} y c es
#{c.class}"}
p.call (4,5) # El valor de a es 4 y b es 5 y c NilClass
l = lambda{|a, b, c| puts "Parametro #{a} y a #{b} y a #{c.class}"}
l.call (4,5) # ArgumentError: wrong number of arguments (2 for 3)...
63. Bloques, Proc y Lambda
Proc Vs Lambda:
- Lambda tiene “mini-returns” y el return en un Proc es
“definitivo”.
def proc_return
Proc.new { return "Proc.new"}.call
return "proc_return metodo"
end
# Proc.new
def lambda_return
lambda { return "lambda" }.call
return "lambda_return método"
end
# lambda_return método
64. Bloques, Proc y Lambda
Proc Vs Lambda:
- Proc no devuelve valores y Lambda si puede devolver
valores por que actúa como método.
def generic_return(code)
one, two = 1, 2
three, four = code.call(one, two)
return "Give me a #{three} and a #{four}"
end
puts generic_return(lambda { |x, y| return x + 2, y + 2 })
puts generic_return(Proc.new { |x, y| return x + 2, y + 2 })
puts generic_return(Proc.new { |x, y| x + 2; y + 2 })
puts generic_return(Proc.new { |x, y| [x + 2, y + 2] })
# => Give me a 3 and a 4
# => *.rb:X: unexpected return (LocalJumpError)
# => Give me a 4 and a
# => Give me a 3 and a 4
67. Manejo de hilos
Declaración:
th = Thread.new([Parámetros]) { [|Parámetros|]
…}
Ejecución:
th.join # Ejecutamos el código almacenado en este hilo
Variables de hilos:
Thread.current['variable'] # 'variable' es una variable almacenada
# en el hilo actual.
68. Manejo de hilos
Declaración:
th = Thread.new([Parámetros]) { [|Parámetros|]
…}
Ejecución:
th.join # Ejecutamos el código almacenado en este hilo
Variables de hilos:
Thread.current['variable'] # 'variable' es una variable almacenada
# en el hilo actual.
Métodos interesantes:
Thread.list # Listado de hilos creados
Thread::kill # Elimina un hilo.