Ruby: Ruby: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... 7mas Jornadas Regionales de Software Libre Agosto de 2007, Córdoba, Argentina JJaavviieerr SSmmaallddoonnee jjaavviieerr@@ssmmaallddoonnee..ccoomm..aarr hhttttpp::////bblloogg..ssmmaallddoonnee..ccoomm..aarr RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... 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 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... 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 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Características 100% orientado a objetos ● objetos + métodos Tipado dinámico ● late binding, duck typing Sintaxis simple ● Principle Of Least Surprise Smalltalk + Perl ● Perl, pero bien hecho 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Clases y meta-clases class Person meta Class Class @@count = 0 new def initialize(name) Object @name = name Meta Object class @@count += 1 == end def self.find(name) Person do_something Meta Person a Person initialize end find @name @count end p = Person.new('Juan Perez') q = Person.find('Pedro Lopez') puts puts p == q ? 'Imposible' : 'Está bien' 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Duck typing Si camina como un pato class Duck y grazna como un pato, def quack debe ser un pato. 'Quack!' end end def make_it_quack(duck) puts duck.quack class Goose end def quack 'Quaaack!' a = Duck.new end b = Goose.new end c = Dog.new class Dog make_it_quack a def bark make_it_quack b 'Arf!' # Error! end make_it_quack c end 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Herencia y mixins module Quack class Duck < Bird def make_it_quack def quack puts quack super + ' quack!' end end end end class Bird class Goose < Bird include Quack def quack def quack super + ' quaaack!' 'I say' end end end end a = Duck.new b = Goose.new a.make_it_quack b.make_it_quack 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Getters y Setters class Person class Person def name attr_accessor :name @name # attr_writer ... end # attr_reader ... end def name=(name) @name = name end end p = Person.new p.name = 'Pepe' puts p.name 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077 RRuubbyy:: ““OOrriieennttaacciióónn aa OObbjjeettooss”” yy aallggoo mmááss...... Introspección 'Hello world'.class String String.superclass Object String.is_a? Object true Duck.respond_to? :quack false Duck.new.respond_to? :quack true String.methods ['superclass', 'id', ..., 'is_a?'] 'Hello'.methods ['to_a', '<<', ..., 'slice!'] 'Hello'.private_methods ['put_c', 'throw', ..., 'warn'] String.instance_methods ['to_a', '<<', ..., 'slice!'] Class.class Class Class.superclass Module Module.superclass Object 77JJRRSSLL CCóórrddoobbaa,, aaggoossttoo ddee 22000077
Description: