¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

65
¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

description

Presentación muy básica sobre Ruby para Zaragozarb. En ella se muestran detalles que me llamaron la atención cuando comencé tiempo ha. También hicimos una serie de ejercicios que consistían en convertir código Ruby a un código más estilo Ruby.

Transcript of ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Page 1: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿Por qué Ruby?

Descubre su expresividad(y peculiaridades)

Page 2: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Sobre mi(muy brevemente)

Page 3: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ruby idiomatico

Page 4: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿idiomatico?

Page 5: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ruby

Yukihiro Matsumoto

“Matz”

Page 6: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ruby● Orientado a objetos● Interpretado● (Muy) Dinámico● Alto nivel● Basado en Perl, Smalltalk, Lisp, C, ...● Metaprogramación● ….

Page 7: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ruby● Orientado a objetos● Interpretado● (Muy) Dinámico● Alto nivel● Basado en Perl, Smalltalk, Lisp, C, ...● Metaprogramación● ….

Page 8: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ruby● Cercano al lenguaje natural● Fácil de leer y escribir● Eficiente● ¡DIVERTIDO! :-)))

Page 9: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿Paréntesis?

puts(“¿Los ponemos co?”)

Page 10: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿Paréntesis?

puts “No es necesario”

Page 11: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetos(de verdad de la buena)

Page 12: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetos"D-Labs mola mucho".class # => String

42.class # => Fixnum

nil.class # => NilClass

[1, 2, 3].class # => Array

(1..9).class # => Range

Page 13: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetos"zARAGOZA-rb".swapcase # => "Zaragoza-RB"

-12345.abs # => 12345

5 * 10 # => 50

Page 14: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetos"zARAGOZA-rb".swapcase # => "Zaragoza-RB"

-12345.abs # => 12345

5 * 10 # => 50

5.*(10) # => Syntactic sugar

Page 15: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetosTime.now # => 2013-06-27...

Time.now.thursday? # => true

2013.even? # => false

5.times{ puts "DRY" } # => 5

Page 16: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Orientado a objetos

"DAba Le ArrOz Al A ZoRrA ELaBAd".downcase.reverse

# => "dabale arroz a la zorra el abad"

Page 17: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

True / nil / falseif 0

"0 es verdadero"

else

"0 es falso"

end

Page 18: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

True / nil / falseif 0

"0 es verdadero"

else

"0 es falso"

end # => "0 es verdadero"

Todo es true excepto nil y false

Page 19: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

If / unlessif !order.valid?

order.block

end

Page 20: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

If / unlessif !order.valid?

order.block

end

order.block unless order.valid?

Page 21: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿¡ Exclamaciones e interrogaciones en

métodos !?

Page 22: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

ConvenioInterrogación retorna booleano

[1, 2, 3, 5].empty? # => false

Page 23: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

ConvenioExclamación acción destructiva

array = [1, 2, 3] # => [1, 2, 3]

array.reverse # => [3, 2, 1]

array # => [1, 2, 3]

array = [1, 2, 3] # => [1, 2, 3]

array.reverse! # => [3, 2, 1]

array # => [3, 2, 1]

Page 24: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Return o no return● Cualquier expresión retorna un valor● Rara vez usas return*

* Es una opinión personal

Page 25: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Return o no returnclass UserKarma

def reset

# Do stuff

total = 0

end

end

Page 26: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

@user = nil

if params[:id]

@user = User.find(params[:id])

else

@user = User.new

end

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 27: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

@user = if params[:id]

User.find(params[:id])

else

User.new

end

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 28: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

Operador ternario:@user = params[:id] ? User.find(params[:id]) : User.new

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 29: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

if my_var

return my_var

else

return another_value

end

http://www.zepho.com/download/ruby-idioms.pdf

Page 30: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

if my_var

return my_var

else

return another_value

end

if my_var

my_var

else

another_value

end

http://www.zepho.com/download/ruby-idioms.pdf

Page 31: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Estructuras condicionales

if my_var

return my_var

else

return another_value

end

if my_var

my_var

else

another_value

end

my_var || another_value

http://www.zepho.com/download/ruby-idioms.pdf

Page 32: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Asignaciones@post = Post.find(params[:id])

if @post

@post.destroy

end

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 33: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Asignaciones@post = Post.find(params[:id])

if @post

@post.destroy

end

if @post = Post.find(params[:id])

@post.destroy

end

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 34: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

AsignacionesEn paralelo:

first, last, street = "Pi", "Filemon", "13 rue del percebe"

# => ["Pi", "Filemon", "13 rue del percebe"]

first, last = last, first

# => ["Filemon", "Pi"]

Page 35: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Asignaciones

@name = "Default name" unless @name

http://www.zepho.com/download/ruby-idioms.pdf

Page 36: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Asignaciones

@name = "Default name" unless @name

@name ||= "Default name"

http://www.zepho.com/download/ruby-idioms.pdf

Page 37: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

AsignacionesVariaciones:

a = 1 # => 1

a += 1 # => 2

a *= 5 # => 10

http://www.zepho.com/download/ruby-idioms.pdf

Page 38: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clase Array(módulo enumerable)

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 39: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Operacionesfoo = [1, 2, 3]

bar = [3, 4, 5]

foo + bar # => [1, 2, 3, 3, 4, 5]

foo * 2 # => [1, 2, 3, 1, 2, 3]

foo & bar # => [3]

foo | bar # => [1, 2, 3, 4, 5]

Page 40: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Iteradores - eachfoo.each do |item|

puts item

end

foo.each{|item| puts item } # => [1, 2, 3]

Page 41: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Iteradores - mapfoo.map do |item|

item*2

end

foo.map{|item| item*2 } # => [2, 4, 6]

Page 42: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Iteradores - injectfoo.inject do |sum, n|

sum + n

end

foo.inject{|sum, n| sum + n } # => 6

Page 43: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Otros métodos[1, 1, 1, 2].uniq # => [1, 2]

[1, [2, 3, [4]], 5].flatten # => [1, 2, 3, 4, 5]

[nil, 1, nil, 2, 3].compact # => [1, 2, 3]

[1, 2, 3].reverse # => [3, 2, 1]

[2, 10, 1].sort # => [1, 2, 10]

Page 44: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Otros métodos[1, 2, 3, 4].find {|n| n % 3 == 0}

# => 3

[1, 2, 3, 4].find_all {|n| n % 2 == 0}

# => [2, 4]

Page 45: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ejemplos prácticos

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu

Page 46: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ejemplo 1● Calcular el precio con IVA de la lista de precios:

precios = [10, 12, 20, 50]

pvp = []

precios.each do |precio|

pvp << precio * 0.21

end

pvp # => [2.1, 2.52, 4.2, 10.5]

Page 47: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ejemplo 1● Calcular el precio con IVA de la lista de

precios:

precios = [10, 12, 20, 50]

pvp = precios.map {|precio| precio * 0.21 }

Page 48: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ejemplo 2● Calcula la suma total de una lista de precios:

precios = [2.1, 2.52, 4.2, 10.5]

total = 0

precios.each do |precio|

total += precio

end

total # => 19.32

Page 49: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Ejemplo 2● Calcula la suma total de una lista de

precios:

precios = [2.1, 2.52, 4.2, 10.5]

total = precios.inject{|sum, precio| sum + precio}

Page 50: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodos

Page 51: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodos

● Típica clase coche con su marca, modelo y color

Page 52: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosclass Car

def initialize(brand=nil, model=nil)

@brand = brand

@model = model

end

def brand

@brand

end

def model

@model

end

def color

@color

end

def color=(new_color)

@color = new_color

end

def brand=(new_brand)

@brand = new_brand

end

def model=(new_model)

@model= new_model

end

end

Page 53: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosclass Car

def initialize(brand=nil, model=nil)

@brand = brand

@model = model

end

...

end

Page 54: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodos ...

def color

@color

end

def color=(new_color)

@color = new_color

end

...

end

Page 55: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosclass Car

attr_accessor :brand, :model, :color

def initialize(brand=nil, model=nil)

@brand = brand

@model = model

end

end

Page 56: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosLos métodos sus parámetros:

● Obligatorios● Con valor por defecto● Aceptar hashes, arrays y bloques

Page 57: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosEjemplo de parámetro opcional:

def foo(a=nil)

# do someting

end

Page 58: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosEjemplo de parámetros obligatorios:

def foo(a, b)

# do someting

end

Page 59: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosEjemplo de parámetros obligatorios:

def foo(a, b, *c)

# do someting

end

Page 60: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosEjemplo de parámetros obligatorios:

def foo(a, options={})

# do someting

end

Page 61: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Clases y métodosEjemplo:

def foo(mandatory, value_not_needed=42, options={})

puts "#{mandatory} - #{value_not_needed}"

puts "Options value: #{options}" unless options.empty?

end

Page 62: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Muchas cosas quedanen el tintero :(

Page 63: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿Preguntas?

Page 64: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¡Gracias! :)

Page 65: ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

Sobre miRafa García

Ando por:

- Twitter: @leptom

- Email: [email protected]

- Github: rgo