Ruby:
Ruby:
““Orientación a Objetos”
Orientación a Objetos”
y algo más...
y algo más...
Ruby: “Orientación
Ruby: “Orientación
a Objetos” y algo más...
a Objetos” y algo más...
7mas Jornadas
Regionales de Software
Libre
Agosto de 2007, Córdoba, Argentina
[email protected] http://blog.smaldone.com.ar
[email protected] http://blog.smaldone.com.ar
Javier Smaldone
Javier Smaldone
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Objetivos de esta charla
● Presentación del lenguaje
no exhaustiva
no es un curso
● Características llamativas
para quien no conozca Lisp ni SmallTalk
● Algunos ejemplos
comparación con otros lenguajes
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Historia
● Desarrollado por Yukihiro “Matz” Matsumoto
liberado en 1993
“conocido” en 2000
● Perl demasiado “sucio”, Python no del todo OO
Smalltalk + sintaxis familiar + regexp +
iteradores + ...
● Ruby on Rails lo llevó a la fama (2004)
excepto en Japón
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Características
● 100% orientado a objetos
objetos + métodos
● Tipado dinámico
● Sintaxis simple
● Smalltalk + Perl
late binding, duck typing
Principle Of Least Surprise
Perl, pero bien hecho
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Clases y meta-clases
class Person
@@count = 0
meta Class
Class
new
def initialize(name)
@name = name
@@count += 1
end
def self.find(name)
do_something
end
end
Meta Object
Meta Person
find
Object
class
==
Person
initialize
@count
a Person
@name
p = Person.new('Juan Perez')
q = Person.find('Pedro Lopez')
puts puts p == q ? 'Imposible' : 'Está bien'
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Duck typing
class Duck
def quack
'Quack!'
end
end
class Goose
def quack
'Quaaack!'
end
end
class Dog
def bark
'Arf!'
end
end
7JRSL
7JRSL
Si camina como un pato
y grazna como un pato,
debe ser un pato.
def make_it_quack(duck)
puts duck.quack
end
a = Duck.new
b = Goose.new
c = Dog.new
make_it_quack a
make_it_quack b
# Error!
make_it_quack c
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Herencia y mixins
module Quack
def make_it_quack
puts quack
end
end
class Bird
include Quack
def quack
'I say'
end
end
class Duck < Bird
def quack
super + ' quack!'
end
end
class Goose < Bird
def quack
super + ' quaaack!'
end
end
a = Duck.new
b = Goose.new
a.make_it_quack
b.make_it_quack
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Getters y Setters
class Person
def name
@name
end
def name=(name)
@name = name
end
end
class Person
attr_accessor :name
# attr_writer ...
# attr_reader ...
end
p = Person.new
p.name = 'Pepe'
puts p.name
Córdoba, agosto de 2007
Córdoba, agosto de 2007
7JRSL
7JRSL
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Introspección
'Hello world'.class
String.superclass
String.is_a? Object
Duck.respond_to? :quack
String
Object
true
false
Duck.new.respond_to? :quack
true
String.methods
'Hello'.methods
['superclass', 'id', ..., 'is_a?']
['to_a', '<<', ..., 'slice!']
'Hello'.private_methods
['put_c', 'throw', ..., 'warn']
String.instance_methods
['to_a', '<<', ..., 'slice!']
Class.class
Class.superclass
Module.superclass
7JRSL
7JRSL
Class
Module
Object
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Clausuras (closures)
● También llamadas “funciones lambda” o “agentes”.
● Funciones y bloques como parámetros.
● Se pasa el bloque como parámetro, incluyendo las
ligaduras al ámbito en donde fue definido.
● Permiten ocultar el entorno y definir funciones de orden
superior.
● Existen en otros lenguajes, pero en Ruby son
“naturales”.
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplos de clausuras
Problema: Multiplicar por 2 los elementos de una lista
PHP
function double($x) {
$y = array();
foreach ($x as $e)
array_push($y, $e*2);
return $y;
}
Haskell
double = map (*2)
Ruby
def double(a)
a.map {|e| e*2}
end
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplos de clausuras
Problema: Dado un arreglo de la forma [["nombre",
"apellido"]], obtener un arreglo de la forma ["apellido,
nombre"]
PHP
function names($a) {
$b = array();
foreach ($a as $e)
array_push($b, $e[1].', '.$e[0]);
return $b;
}
Ruby
Haskell
join [x,y] = x ++ ", " ++ y
names = map (join . reverse)
7JRSL
7JRSL
def names(a)
a.map{|e| e.reverse.join(', ')}
end
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplos de clausuras
Problema: Calcular la edad promedio de las
personas mayores de edad.
PHP
Ruby
adults = people.select{|p| p.age > 18}
sum = 0
adults.each {|p| sum += p.age }
puts sum.to_f/adults.size if adults.size > 0
$sum = 0;
$count = 0;
foreach ($people as $p){
if ($p->age > 18){
$sum += $p->age;
$count++;
}
}
if ($count)
print $sum/$count;
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplos de clausuras
Problema: Calcular la edad promedio de las
personas mayores de edad.
Ruby
adults = people.select{|p| p.age > 18}
sum = 0
adults.each {|p| sum += p.age }
puts sum.to_f/adults.size if adults.size > 0
adults = people.select{|p| p.age > 18}
sum = adults.map{|p| p.age}.inject{|ac,e| ac+e}
puts sum.to_f/adults.size if sum
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplos de clausuras
Problema: Encontrar la palabra más larga de una lista.
function maxpal($a) {
$max = '';
foreach ($a as $e)
if (strlen($e) > strlen($max))
$max = $e;
return $max;
}
PHP
maxp xs ys = if (length xs) > (length ys) then xs
else ys
maxpal = foldl maxp ""
Haskell
def maxpal(a)
a.inject {|m, e| e.length > m.length ? e : m }
end
Ruby
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Ejemplo: QuickSort
qs :: Ord a => [a] -> [a]
qs [] = []
qs (x:xs) = (qs (filter (<=x) xs))++[x]++(qs (filter (>x) xs))
class Array
def head
self[0]
end
def tail
slice(1..-1)
end
def qs
empty? ? [] : tail.select{|e| e<=head}.qs +
[head] +
tail.select{|e| e>head}.qs
end
end
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Referencias
● Sitio oficial de Ruby
● Ruby Central
http://www.ruby-lang.org
http://www.rubycentral.com
● Documentación (API completa)
http://www.ruby-doc.org
● Ruby on Rails (framework para aplicaciones web)
http://www.rubyonrails.org
● Ruby en tu navegador (tutorial interactivo)
7JRSL
7JRSL
http://tryruby.hobix.com
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
Referencias
● Tutorial sobre Ruby y metaclases
http://www.visibleworkings.com/little-ruby/
● Comparativa de performance
http://www.antoniocangiano.com/articles/2007/02/19/ruby-
implementations-shootout-ruby-vs-yarv-vs-jruby-vs-gardens-point-
ruby-net-vs-rubinius-vs-cardinal
● Los lenguajes tienden a Lisp
http://kapcoweb.com/p/static/docs/la-venganza-de-los-nerds/la-
venganza-de-los-nerds.html
http://www.paulgraham.com/icad.html
● Por qué Ruby es un Lisp aceptable
http://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-
acceptable-lisp
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación a Objetos” y algo más...
Ruby: “Orientación a Objetos” y algo más...
¿Preguntas?
7JRSL
7JRSL
Córdoba, agosto de 2007
Córdoba, agosto de 2007
Ruby: “Orientación
Ruby: “Orientación
a Objetos” y algo más...
a Objetos” y algo más...
¡Muchas gracias!
[email protected] http://blog.smaldone.com.ar
[email protected] http://blog.smaldone.com.ar
Javier Smaldone
Javier Smaldone
© Copyright 2007 – Javier Smaldone
Esta obra licenciada bajo una Licencia Creative
Commons Atribución-Compartir Obras Derivadas
Igual 2.5 Argentina.
http://creativecommons.org/licenses/by-sa/2.5/ar/
Comentarios de: Ruby: Orientación a Objetos y algo más (0)
No hay comentarios