PDF de programación - Ruby: Orientación a Objetos y algo más

Imágen de pdf Ruby: Orientación a Objetos y algo más

Ruby: Orientación a Objetos y algo másgráfica de visualizaciones

Actualizado el 6 de Febrero del 2020 (Publicado el 8 de Marzo del 2018)
879 visualizaciones desde el 8 de Marzo del 2018
117,9 KB
22 paginas
Creado hace 16a (09/08/2007)
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/
  • Links de descarga
http://lwp-l.com/pdf9308

Comentarios de: Ruby: Orientación a Objetos y algo más (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad